Tuesday, September 15, 2015

[Bài tập mẫu] Kiểu tập tin trong C/C++

I. Câu hỏi.
 1.    Sự khác nhau giữa stream văn bản và stream nhị phân là gì?
2.    Chương trình của bạn phải làm gì trước khi nó có thể truy cập đến một file?
3.    Khi mở một file với hàm fopen(), cần phải chỉ định thông tin gì và hàm này trả về giá trị gì?
4.    Hai phương thức tổng quát để đọc thông tin trong file?
5.    Giá trị EOF là gì? Khi nào EOF được dùng?
6.    Làm thế nào để kiểm tra tình trạng của cuối file trong mode văn bản và mode nhị phân?
7.    Bộ định vị file là gì? Làm thế nào có thể thay đổi nó.?
8.    Khi một file được mở lần đầu tiên, bộ định vị file trỏ vào đâu?
9.    Viết mã để đóng tất cả stream file.
10.    Chỉ ra hai cách để chuyển bộ định vị file về đầu file.
11.    Có gì sai trong đoạn mã sau?
FILE *fp; int c;
if ( ( fp = fopen( oldname, "rb" ) ) == NULL )
 return -1;
while (( c = fgetc( fp)) != EOF )
 fprintf( stdout, "%c", c ); 
fclose ( fp );
TRẢ LỜI:
1.Stream văn bản thực hiện tự động việc chuyển đổi giữa ký tự newline (\n) được C dùng để đánh dấu kết thúc dòng, thành cặp ký tự CR, LF được DOS dùng để đánh dấu kết thúc dòng. Ngược lại, stream nhị phân không thực hiện việc chuyển đổi. Tất cả các bye đều được đưa vào và lấy ra mà không có sự thay đổi.
2.Dùng hàm fopen().
3.Khi dùng hàm fopen(), phải chỉ định tên file cần mở và mode để mở nó. Hàm open() trả về con trỏ trỏ đến kiểu FILE.
4.Tuần tự và ngẫu nhiên.
5.EOF là cờ hiệu cuối file. Nó là hằng ký tự -1. EOF được dùng đối với file văn bản để xác định khi nào thì đạt đến điểm kết thúc file.
6.Trong mode nhị phân phải dùng hàm feof(). Trong mode văn bản phải tìm kiếm ký tự EOF hoặc dùng hàm feof().
7.Bộ định vị file chỉ định vị trí trong một file mà tại đó việc đọc ghi tiếp theo xãy ra. Có thể thay đổi bộ định vị file bằng các hàm rewind() và fseek().
8.Bộ định vị file trỏ đến ký tự đầu tiên của file. Một ngoại lệ là nếu ta mở một file đã tồn tại để thêm thì bộ định vị file sẽ trỏ vào cuối file.
9.fcloseall();
10.rewind(fp); and fseek(fp, 0, SEEK_SET);
11.Không thể dùng EOF để kiểm tra tình trạng cuối file nhị phân mà phải dùng hàm feof().
 II Bài tập.
Bài 1. Viết chương trình thực hiện các yêu cầu:
•    Nhập 10 số thực vào một file văn bản có tên là INPUT.
•    Đọc nội dung file INPUT.
•    Tính tổng bình phương các số có trong file INPUT.
#include <stdio.h>
#include <stdio.h>
#include <stdlib.h> 
#include <conio.h>
void write(){
 FILE *f = fopen("input","wt");
 /*Ghi vao file van ban 10 so thuc */
 for (int i=1; i<=10;i++)
 { float a;
 printf("\n Nhap so thu %d: ",i);
 scanf("%f", &a); 
 fprintf(f,"%f ",a);
 }
 fclose(f);
}
void read(){
 int i;float a;
 FILE *f = fopen("input","rt");
 printf("\n Noi dung tap tin la : \n\n");
 do
 { fscanf(f,"%f",&a);
 if (!feof(f)) printf("%.2f ",a);
 } while (!feof(f));
 fclose(f);
}
float tongbp(){
 int i;float tong = 0;
 FILE *f = fopen("input","rt"); 
 do
 { float a; 
 fscanf(f,"%f",&a);
 if (!feof(f))
  tong+=a*a;
 }while (!feof(f)); 
 fclose(f);
 return tong;
}
void main()
{ 
 write(); 
 read();
 printf("\n Tong binh phuong la %.2f \n ",tongbp());
 getch();
}
Bài 2. Viết chương trình thực hiện các yêu cầu:
•    Mở tập tin mới và nhập vào một số mẫu tin. Mỗi mẫu tin bao gồm các trường: họ tên, tuổi, lương. Quá trình nhập dữ liệu kết thúc khi họ tên nhập vào là rỗng.
•    Thêm dữ liệu vào tập tin.
•    Mở tập tin để đọc và hiển thị ra màn hình nội dung tập tin.
/* Chuong trinh file truy nhap tuan tu */
/* Chuong trinh file truy nhap tuan tu */
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <conio.h>
#define maxten 30 
#define maxtenfile 11 
struct HSCB{
 char hoten[maxten+1]; int tuoi;
 long luong; }
hoso;
void Hienthi(HSCB *,int); 
void Nhap();
void Indanhsach(); 
void Them();
char tenfile[maxtenfile+1]; 
FILE *f1;
void Nhap()
{
 int i,n;
 /* Tao file */ 
 printf("\nCho ten file : "); 
 gets(tenfile);
 if ((f1=fopen(tenfile,"wb"))==NULL)
 {
  printf("\nLoi mo file - Chuong trinh ket thuc\n"); 
  exit(1);
 }
 /* Vao so lieu  */
 printf("Vao so lieu , muon thoi thi den muc Ten an Enter\n");
 n = 0; /* Dem so phan tu trong file */
 do
 {
  printf("Ten : ");
  gets(hoso.hoten);
  if (strlen(hoso.hoten)==0) break; /* Ket thuc neu ten la rong */
  n++;
  printf("Tuoi : "); 
  scanf("%d",&hoso.tuoi); 
  printf("Luong : "); 
  scanf("%ld",&hoso.luong);
  getchar(); /* Xuong dong trong file sau mot nguoi */ 
  printf("\n");
  fwrite(&hoso,sizeof(hoso),1,f1); /* Ghi vao file */
 }while (1);
 fclose(f1);
 printf("\nKet thuc viec tao file va ghi du lieu vao ."); 
 printf("\nTrong file nay co %d phan tu (nguoi)",n); 
 getch();
}
void Indanhsach()
{ /* Hien thi noi dung file */ int n;
do{
 printf("\nCho ten file can doc : "); 
 gets(tenfile);
 if ((f1=fopen(tenfile,"rb"))==0) 
  printf("\nKhong tim thay file - Cho lai ten\n"); } 
while (!f1);
n = 1;
while (fread(&hoso,sizeof(hoso),1,f1))
 Hienthi(&hoso,n++);
fclose(f1);
printf("\nDoc xong danh sach trong file .");
}
void Them()
{/* Them du lieu vao cuoi file */ int n;
do{
 printf("\nCho ten file can them du lieu : "); 
 gets(tenfile);
 if ((f1=fopen(tenfile,"ab"))==0) 
  printf("\nKhong tim thay file - Cho lai ten\n");
}
while (!f1); 
do
{
 printf("Ten : "); 
 gets(hoso.hoten);
 if (strlen(hoso.hoten)==0) 
  break; 
 n++;
 printf("Tuoi : "); 
 scanf("%d",&hoso.tuoi); 
 printf("Luong : "); 
 scanf("%ld",&hoso.luong);
 getchar(); /* Xuong dong trong file sau mot nguoi */ 
 printf("\n");
 fwrite(&hoso,sizeof(hoso),1,f1); /* Ghi vao file */ }
while (1);
fclose(f1);
printf("\nKet thuc viec ghi them du lieu vao cuoi file.");
getch();
}
void Hienthi(HSCB *hoso,int so)
{
 int i;
 printf("\nSo ho so : %d\n",so); 
 printf("Ten : %s\n",hoso->hoten); printf("Tuoi : %d\n",hoso->tuoi); 
 printf("Luong : %ld\n",hoso->luong);
}
void main() { 
 Nhap();
 Indanhsach();
 Them();
 Indanhsach();
 getch();
}

Bài 3. Tương tự bài 1, nhưng bổ sung các thao tác trên tập tin: tu sửa và thêm mẫu tin mới.
/* Chuong trinh file truy nhap tuan tu - : tao,xem,sua,them vao cuoi file,cho phep chon ten file */
/* Chuong trinh file truy nhap tuan tu - : tao,xem,sua,them vao cuoi file,cho phep chon ten file */

#include <stdio.h> 
#include <conio.h> 
#include <string.h> 
#include <stdlib.h>

#define maxten 30 
#define maxtenfile 40

struct HSCB
{
 char ten[maxten+1]; int tuoi;
 long luong; }
hoso;
char tenfile[maxtenfile+1];
FILE *f1;
int n, /* so ho so  */
 ngoai; /* so > so ho so */
long sohoso,vitri; /* vi tri hien tai trong file  */
char dong[maxtenfile+1];
void TaoFile(void);
void Hienthi(struct HSCB *,int); 
void Sua(HSCB *);
void Them(void);
void main()
{
 int i;
 /* Mo file  */
 printf("\n********** MO FILE ***********\n");
 do
 {
  printf("\nCho ten file can mo : "); 
  gets(tenfile);
  if ((f1=fopen(tenfile,"wt"))==NULL) 
   printf("\nLoi mo file - Cho lai ten file\n");
 }while (!f1); 
 TaoFile();
 /* Hien thi noi dung file */
 do
 {
  printf("\n******* XEM NOI DUNG FILE ***********\n");
  printf("\nTen file dang soan : %s\n",tenfile); 
  printf("\nCho ten file (neu la file dang soan thi an Enter): ");
  gets(dong); /* Cho ten moi  */
  if (strlen(dong))   strcpy(tenfile,dong);
  if ((f1=fopen(tenfile,"rt"))==0) 
   printf("\nKhong tim thay file - Cho lai ten\n");
 } while (!f1); n = 1;
 while (fread(&hoso,sizeof(hoso),1,f1))
 {
  Hienthi(&hoso,n++);
  getchar();
 }
 fclose(f1);
 printf("\nDoc xong danh sach trong file.\n\n"); /* Sua du lieu trong file */
 do
 {
  printf("\n**** SUA CHUA NOI DUNG FILE *****\n");
  printf("\nTen file dang soan : %s\n",tenfile); 
  printf("\nCho ten file (neu la file dang soan thi an Enter): ");
  gets(dong); /* Cho ten moi */
  if (strlen(dong)) strcpy(tenfile,dong);
  if ((f1=fopen(tenfile,"r+t"))==0)
   printf("Khong tim thay file tren dia\n");
 }
 while(!f1);
 fseek(f1,0,2);
 sohoso = ftell(f1) / sizeof(hoso);
 /* Tim va sua ho so */
 do
 {
  do
  {
   printf("\nCho so ho so can sua (go 0 de stop) : "); 
   scanf("%d",&n);
   getchar();
   /* De nhay qua ki tu cuoi \n */ 
   ngoai = n<0 || n>sohoso;
  } while (ngoai);
  if (n==0) break;   /* Khong sua ra khoi vong lap  */
  vitri = (n-1)*sizeof(hoso); /* Tinh vi tri cua ho so can sua */
  fseek(f1,vitri,0); /* Dinh vi con tro den ho so */
  fread(&hoso,sizeof(hoso),1,f1); /* Doc mot ho so vao bo nho */
  Hienthi(&hoso,n); /* Hien thi noi dung ho
        so o bo nho */
  Sua(&hoso); /* Sua ho so o bo nho
     */
  fseek(f1,vitri,0);
  fwrite(&hoso,sizeof(hoso),1,f1); /* Ghi ho so da sua vao file */
 }while(1);
 fclose(f1);
 printf("\nDa sua xong\n\n");
 /* Xem lai noi dung file da sua */
 printf("\n****** XEM LAI NOI DUNG FILE *********\n");
 if ((f1=fopen(tenfile,"rt"))!=0) n = 1;
 while (fread(&hoso,sizeof(hoso),1,f1))
 {
  Hienthi(&hoso,n++);
  getchar();
 }
 fclose(f1);
 printf("\nDoc xong danh sach trong file .\n\n");
 getch();
 /* Them du lieu vao cuoi file */
 do
 {
  printf("\n*** THEM DU LIEU VAO CUOI FILE *****\n");
  printf("\nTen file dang soan : %s\n",tenfile); 
  printf("\nCho ten file (neu la file dang soan thi anEnter): ");
  gets(dong); /* Cho ten moi  */
  if (strlen(dong))
   strcpy(tenfile,dong);
  if ((f1=fopen(tenfile,"at"))==0) /* Mo file de them vao cuoi */
   printf("Khong tim thay file tren dia\n"); } 
 while(!f1);
 Them();
 /* Hien thi noi dung file */
 do
 {
  printf("\n******* XEM NOI DUNG FILE ***********\n");
  printf("\nTen file dang soan : %s\n",tenfile); 
  printf("\nCho ten file (neu la file dang soan thi an Enter): ");
  gets(dong); /* Cho ten moi  */
  if (strlen(dong)) 
   strcpy(tenfile,dong);
  strcpy(tenfile,dong);
  if ((f1=fopen(tenfile,"rt"))==0) 
   printf("\nKhong tim thay file - Cho lai ten\n");
 }while (!f1); 
 n = 1;
 while (fread(&hoso,sizeof(hoso),1,f1)){
  Hienthi(&hoso,n++); 
  getchar();
 }
 fclose(f1);
 printf("\nDoc xong danh sach trong file.Enter to stop !");
 getch();
}
void TaoFile(void)
{
 int i;
 printf("Vao so lieu , muon thoi thi den muc Ten an Enter\n");
 n = 0; /* Dem so phan tu trong file */ 
 do
 {
  printf("Ten : "); 
  gets(hoso.ten);
  if (strlen(hoso.ten)==0) break; /* Ket thuc neu ten la rong */
  n++;
  printf("Tuoi : "); 
  scanf("%d",&hoso.tuoi); 
  printf("Luong : "); 
  scanf("%ld",&hoso.luong);
  getchar(); /* Xuong dong trong file sau mot nguoi  */
  printf("\n");
  fwrite(&hoso,sizeof(hoso),1,f1); /* Ghi vao file */ }
 while (1);
 fclose(f1);
 printf("\nKet thuc viec tao file va ghi du lieu vao ."); 
 printf("\nTrong file nay co %d phan tu (nguoi)",n); 
 getch();
}
void Hienthi(HSCB *hoso,int so)
{
 int i;
 printf("\nSo ho so : %d\n",so); 
 printf("Ten : %s\n",hoso->ten); 
 printf("Tuoi : %d\n",hoso->tuoi); 
 printf("luong %ld\n",hoso->luong);
}
void Sua(HSCB *hoso)
{
 int i;
 printf("Sua chua so lieu , go Enter neu khong sua\n");
 printf("Ten : "); 
 gets(dong); /* Cho ten moi */
 if (strlen(dong)) 
  strcpy(hoso->ten,dong); 
 printf("Tuoi : "); 
 gets(dong); /* Cho tuoi moi */
 if (strlen(dong)) 
  hoso->tuoi = atoi(dong);
 printf("luong : "); 
 gets(dong); /* Cho so moi */
 if (strlen(dong)) 
  hoso->luong = atoi(dong);
}
void Them(void)
{
 int i;
 printf("Vao so lieu , muon thoi thi den muc Ten an Enter\n");
 do
 {
  printf("Ten : "); 
  gets(hoso.ten);
  if (strlen(hoso.ten)==0) break; /* Ket thuc neu ten la rong */
  n++;
  printf("Tuoi : "); 
  scanf("%d",&hoso.tuoi); 
  printf("luong : "); 
  scanf("%ld",&hoso.luong);
  getchar(); 
  /* Xuong dong trong file sau mot nguoi */ 
  printf("\n");
  fwrite(&hoso,sizeof(hoso),1,f1); /* Ghi vao file */ } 
 while (1);
 fclose(f1);
 getch();
}
Bài 4. Mở một tập tin văn bản, tính kích thước và thống kê số lần xuất hiện các chữ cái trong tập tin văn bản đó.
#include <stdio.h> 
#include <stdlib.h> 
#include <dos.h> 
#include <conio.h> 
int a[254];
void main()
{
 FILE *f; unsigned char c;
 char tap_tin[79];
 int k;
 long kich_thuoc; int dong = 1;
 for (k = 0; k < 254; k++) a[k] = 0;
 clrscr();
 printf("\nDOC TAP TIN VAN BAN VA VA THONG KE CHU");
 printf("\n-Cho biet ten tap tin can doc: ");
 gets(tap_tin);
 f = fopen(tap_tin, "rt");
 if (f == NULL)
 {
  perror("\nKhong doc duoc, vi: "); printf("\nBam phim bat ky de ket thuc");
  getch();
  exit(1);
 }
 else
  printf("\nNoi dung tap tin : \n"); while (!feof(f))
 {
  c = fgetc(f);
  putchar(c);
  a[c]++;
 }
 kich_thuoc = ftell(f);
 printf("\n-Kich thuoc tap tin: %ld bytes", kich_thuoc + 1);
 printf("\n\tBam phim bat ky de thong ke chu");
 getch();
 fclose(f);
 printf("\nThong ke cac chu trong tap tin\n");
 for (c = 'A'; c <= 'z'; c++)
 {
  printf("-Chu: %c -Tan so: %3d\n", c, a[c]);
  dong += 1;
  if (dong == 24)
  {
   printf("\nBam phim bat ky de xem tiep\n");
   getch();
   dong = 1;
  }
 }
 printf("\n Bam phim bat ky de ket thuc");
 getch();
}


Cám ơn bạn đã đọc bài viết này. Hãy chia sẻ bài viết và bình luận ý kiến của bạn ở bên dưới.

Share this

Chào mừng bạn đến với SimpleCodeCJava Blog - Mục đích của chúng tôi khi thành lập blog này là muốn chia sẻ những kiến thức và kinh nghiệm lập trình mà chúng tôi đã học được với mong muốn giúp đỡ mọi người, giúp bạn rút ngắn được thời gian tìm hiểu cũng như việc giải quyết những vấn đề trong lập trình C và Java.

0 Comment to "[Bài tập mẫu] Kiểu tập tin trong C/C++"