Home / Blogs / đọc từng dòng trong file cĐỌC TỪNG DÒNG TRONG FILE C28/04/2022 It-Pro Training Xử lý dữ liệu tệp văn bản - Lập trình C : Bài 18 Xử lý dữ liệu tệp văn bản - Lập trình C : Bài 18 Xửlý dữ liệu tệp văn bản - Lập trình C : Bài 181.Giới thiệuDữ liệu file văn bản bao gồm một tập hợp các chuỗi kýtự và văn bản được tổ chức thành dòng. Mỗi dòng có độ dài khác nhau, số lượng lớnnhất các kí tự trong 1 dòng là 256 ký tự. Mỗi dòng được đánh dấu bởi ký tự kếtthúc dòng hay dấu xuống dòng. Trong DOS đó là cặp ký tự điều khiển CR(CarriageReturn: nhảy về đầu dòng , mã số ASCII = 13, ‘\r’) và LF (Line Feed : Nhảy thẳngxuống dòng tiếp theo, mã số ASC II = 10, ‘\n’). Khi lập trình C chỉ cần dùng‘\n’ là đủ để cách 2 dòng.Bạn đang xem: Đọc từng dòng trong file cVí dụ đoạn văn bản sau:Lap Trinh C123Ket ThucKhi đó nếu xét theo cấu trúc của file văn bản trongDOS sẽ như sauLap trinh C CR LF 123 CRLF Ket Thuc EOFKhi lập trình C thì file *.c là một loại file văn bảnđược sử dụng để lưu trữ các đoạn mã chương trình C.2.Làm việc với File văn bảnC cung cấp 4 hàm sau đây để thực hiện đọc file văn bản.+ fscanf()+ fgets()+ fgetc()+ fread()Với thao tác ghi file văn bản. C cung cấp 4 hàm sau+ fprintf()+ fputs()+ fputc()+ fwrite()2.1 Hàm putc và puts.2.1.1 Hàm putc()Hàm putc thực hiện ghi một ký tự vào một luồn dữ liệugắn với file. Nếu nói một cách đơn giản thì nó thực hiện việc ghi dữ liệu mộtcharacter vào một file.Cú pháp:int putc(int ch, FILE *fp);Mô tả : +ch: là ký tự muốn ghi vào trong file+fp: con trỏ trỏ đến Filegiá trị trả về hàm putc: + Nếu không lỗi thì trả về chính là ch.+ Nếu có lỗi : trả về EOF (Có giá trị là 0).Code minh họaHìnhsố 1 : Ví dụ về sử dụng hàm fputcKhi chạy chương trình kết quả sẽ ghi dữ liệu ra filefile.txt như sau!"#$%&"()*+,-./0123456789:;?ABCDEFGHIJKLMNOPQRSTUVWXYZ<\>^_`abcd2.1.2 Hàm puts()Vai trò của hàm puts là ghi xâu kí tự (string) vào luồngdữ liệu, luồng dữ liệu này ghắn kết với file. Kết quả hàm thực hiện ghi xâu ký tựvào trong file này.Cúphápcharfputs(char *str, FILE *fp);str: con trỏ kiểu char, bản chất nó chính xâu ký tự fp:con trỏ fileHàmtrả về một giá trị không âm nếu quá trình ghi file thành côngNếulỗi hàm sẽ trả về EOF (Có giá trị 0).VídụHìnhsố 2 : Ví dụ về sử dụng hàm fputsHàm thực hiện ghi 2 dòng “Ngon ngu lap trinh C” và“Lam viec voi file Van Ban” vào file.txt. vì sử dụng fopen(“file.txt”,”w+”) dovậy nếu file.txt đã tồn tại thì thực hiện xóa file này và tạo mới file. Ngược lạinếu chưa có file.txt thì sẽ tiến hành tạo mới file.txt.Khi sử dụng fputs(“Ngon ngu Lap trinh C .\n”,fp); thìsẽ ghi xây ký tự “Ngon ngu Lap trinh C” vào file. Kêt thúc dòng này là thực hiệnxuống dòng.Vậy khi đó dữ liệu sẽ được ghi vào file.txt trên 2dòng riêng biệt.2.2 Kết thúc file (EOF – End of File)Khi thực hiện đọc file, làm thế nào để xác định đượcquá trình đọc là kết thúc. Có một cách là dựa vào kí tự đặc biệt để đánh dấu kếtthúc file. Ví dụ+ Kí tự # được đặt để xác định dòng cuối cùng+ Trong DOS sử dụng Ctr-z như là một ký tự đặc biệt để xác định kết thúc file. + Trong UNIX sử dụng Ctr-d như là một ký tự đặc biệt để xác định kết thúc file.Xácđịnh kết thúc fileĐôi khi không biết chính xác mất thời gian bao lâu đểđọc dữ liệu của một file tính từ thời điểm bắt đầu tiến trình đọc file đến khikết thúc tiến trình đọc file. Có 2 cách để xác định kết thúc một file, khi đọc dữ liệufile văn bản, quá trình xử lý sẽ đọc từngkí tự một, khi đó lập trình viên có thể đọc được kí tự đánh dấu kết thúc file.Các hằng số biểu tượng EOF được định nghĩa trongstdio.h có giá trị là -1. Khi thực hiện các hàm đọc dữ liệu file văn bản theocách thức đọc từng kí tự, thì quá trình đọc được thực hiện cho đến khi gặp kí tựđánh dấu kết thúc file. Vì ở đây quá trình đọc được thực hiện cho đến khi gặpkí tự đánh dấu kết thúc file nên các lập trình viên thường sử dụng while hoặcdo - whilewhile((c= fgetc(fp)) != EOF) Hàm fgetc(fp) trả về một char, Trong trường hợpfgetc(fp) == EOF thì kết thúc quá trình đọc file.2.3. Các hàm fgetc và fgetsSử dụng các hàm fgetc và fgets phục vụ cho quá trình đọcdữ liệu từ file văn bản.Xem thêm: Dạy Bé Tập Viết Bảng Chữ Cái Tiếng Việt, Mẫu Chữ Nét Đứt2.3.1 Hàm fgetc Hàm fgetc() được sử dụng để đọc một kí tự từ dữ liệu từfile văn bản.Cúphápintgetc(FILE *fp);đọc một ký tự từ tệp văn bản được xác định bởi con trỏFILE *fp. fp là tham số hình thức có kiểu con trỏ. fp là kết quả thực hiện củahàm fopen();Vậy lý do tại sao getc được sử dụng để đọc từng kí tựcủa FILE mà lại có kết quả trả về là int? Lý do đó là khi thực hiện đọc file,ký tự đánh dấu Kết thúc file (EOF) có giá trị int chứ không phải char.VídụSử dụng hàm getc đọc toàn bộ ký tự được ghi trongfile.txt tương ứng với ví dụ hình số 2.Codeminh họaHìnhsố 3: Sử dụng hàm fgetc để đọc fileSử dụng while để kiểm tra kết thúc file (EOF) khi thựchiện đọc file. Kết quả thực hiện in ra được 2 xâu chứa chuỗi ký tự.2.3.2 Hàm fgetsHàm fgets được sử dụng đọc xâu kí trong file văn bản tựtheo dòng.Cúphápchar*fgets(char *str, int n, FILE *fp);Môtảstr: Con trỏ char thực chất là string, bản chất là mảng charsn:số lượng character lớn nhất khi thực hiện đọc, ỏ đây chính là kích cỡ của mảngcharfp:con trỏ FILE Hàm sẽ thực hiện dừng đọc file văn bản khi một trongcác điều kiện sau đây là đúng.+ Đọc được n-1 bytes.+ Gặp một dòng mới+ Đọc khi gặp kí tự kết thúc file.+ Đọc khi lỗi xuất hiện.VídụSử dụng hàm fgets để đọc file “file.txt” ở ví dụ đượctrình bày tại hình 2. Code minh họaHìnhsố 4: Sử dụng hàm fgetsKhi sử dụng hàm fgets để đọc nội dung của “file.txt”,sử dụng while để thực hiện đọc từng dòng dữ liệu text. Và thực hiện in ra kếtquả bằng việc sử dụng hàm printf.2.3.3Hàm fscanfHàm đọc giá trị từ tệp văn bản. Hàm này gọi là hàm hướngtrường dữ liệu (field-oriented function). Đặc trưng của hàm ngày cũng tương tựnhư hàm scanf. Hàm scanf khi đọc dữ liệu từ bàn phím, nếu gặp ký tự trống thì lậptức nó coi như kí tự phân cách giữa các trường và chấm dứt việc đọc dữ liệu đâylà vấn đề có sự khác nhau giữa hàm scanf và hàm gets.Ví dụ Hàm scanfHìnhsố 5 : Hàm scanfTrong ví dụ trên : Khi nhập “Programming C with file”,thì nội dung thông tin in ra là “Programming” điều đó có nghĩa là hàm scanf khigặp dấu trống lập tức chấm dứt việc ghi thông tin.Nếu thay hàm scanf băng hàm gets thì nội dung thôngtin sẽ được hiển thị đầy đủCode minh họaHìnhsố 6 : Hàm getsTương tự như fscanf được sử dụng để đọc file, khi gặpdấu trống thì hàm fscanf dẽ coi nó như dấu phân cách giữa các trường. Vì nó làhàm hướng trường dữ liệu do vậy nó sẽ kết thúc quá trình đọc 1 trường thông tin(1 cột) khi gặp dấu phân cách giữa các trường.Ví dụ:Lưu ý khi đọc file văn bản, để chắc chắn chúng ta sử dụnghàm rewind() để thiết lập vị trí con trỏ đọc file về đầu file.char str<100>;FILE * fp;fp= fopen ("file.txt", "r");fscanf(fp, "%s",str);printf("Read String |%s|\n", str );Khi đó kết quả in ra chỉ là “Ngon”, Vậy hàm fscanf nếu đọc các file văn bản có format duoidạng các cột thông tin hay các bảng chứa dữ liệu thì độ hiện quả sẽ rất tốt.