*
It-Pro Training
*

Tổng quát tháo cách xử lý File - Lập trình C: Bài 17

1.Giới thiệu

Một tệp tài liệu (file) là một tập vừa lòng tài liệu, chúnghay được tàng trữ trên các sản phẩm nhỏng Ổ đĩa, USB, Đĩa cứng tốt bên trên các đámmây. Với các chương trình C từ bài thứ nhất đến thời điểm này, dữ liệu nhtràn vào vào mộtcông tác được nhập trường đoản cú trải qua các keyboard máy tính ...Tuy nhiên tất cả nhiềucách thức nhằm nhập tài liệu đầu vào cũng tương tự xuất tài liệu đầu mang đến chương trình đólà trải qua tệp dữ liệu. Chương trình C vẫn hiểu tài liệu tự tệp dữ liệu, sau khiso sánh, cách xử lý cùng tính toán với một khối tài liệu, thì chúng sẽ tiến hành lưu trữ trsinh sống lạitệp tài liệu.

Bạn đang xem: Thao tác với file trong c

Vậy tệp tài liệu là địa điểm lưu trữ công bố dữ liệu sẽ đượccách xử lý bởi vì chương trình. Tệp dữ liệu không chỉ là là địa điểm lưu trữ tài liệu mà lại xéttheo tinh tướng mở rộng thì nó còn là nơi đựng lịch trình xúc tiến. lấy ví dụ nhưcác tệp bao gồm đuôi không ngừng mở rộng là .exe đây là những tệp tiến hành của một chương trình.

Để sử dụng tệp dữ liệu bọn họ đã tìm hiểu các vấn đềliên quan cho tới vào/ra (I/O) của tệp.. Cách thức ghi lên tiếng vào một trong những file, cácthức phát âm lên tiếng xuất phát điểm từ một tệp tin. Có thể nhìn nhận những thao tác làm việc vào/ra một filecũng tương tự nhỏng những làm việc vào/ra bên trên một thứ đầu cuối, tuy vậy điểmkhác hoàn toàn cơ bạn dạng của thao tác làm việc vào/ra với file cùng sản phẩm đầu cuối đó là chươngtrình cần được khẳng định một tệp tin ví dụ bởi vì có nhiều tệp tin trong ổ cứng. Xácđịnh chính xác một file với các thao tác làm việc với file như hiểu tệp tin, ghi tệp tin hoặc vớicả nhì thao tác làm việc đọc/ghi file.

Một tư tưởng quan trọng đặc biệt nữa liên quan chính là stream(Luồng dữ liệu). C cung ứng khai niệm luồng tài liệu (stream) là một khái niệutrừu tượng hóa nằm giữa người lập trình sẵn vào đồ vật vào/ra. Các thiết bịvào/ra vào xây dựng C sẽ là màn hình, thiết bị in, bàn phím với tệp dữ liệu(file). Trong ngôi trường đúng theo này lắp thêm vào/ra cụ thể là tệp tin với một luồng dữ liệulà 1 trong đồ họa ngắn gọn xúc tích gồm liên quan cho tới file. Mặc mặc dù File có khá nhiều hình trạng mẫukhác nhau tuy vậy với luồng như liệu thì tất cả các tương đương nhau. Luồng dữ liệuhỗ trợ tính giao diện đồng hóa mang lại xây dựng viên. Luồng dữ liệu vào/ra sử dụngvùng tài liệu nhất thời để lưu trữ, vùng dữ liệu tạm bợ Điện thoại tư vấn là buffer tuyệt gọi là bộ nhớ lưu trữ đệmcùng được thực hiện để phát âm cùng ghi tệp tin.

Xét một phương pháp rõ ràng, những thứ nước ngoài vi nlỗi ổ đĩa,băng trường đoản cú và các sản phẩm ngoại vi là hoàn toàn không giống nhau. Song khối hệ thống tệp tin vớibộ lưu trữ đệm đã chuyển đổi bọn chúng thành một lắp thêm logic được hotline là luồng dữ liệu(Stream) do thế và một hàm ghi dữ liệu ra tệp tin trên đĩa thì có thể thực hiện nóra những sản phẩm công nghệ khác ví như màn hình hiển thị, đồ vật in.

Hình minc họa mô hình vào/ra của luồng dữ liệu:

*

Hìnhtiên phong hàng đầu : Mô hình vào/ra luồng dữ liệu

Mô hình trên là quy mô vào/ra kết quả. khi tạo thành luồngtài liệu liên kết với một file trên ổ đĩa, thì bộ nhớ đệm được tự động tạo ra vànó được gắn kết cùng với luồng dữ liệu. RAM là 1 trong kân hận bộ lưu trữ trợ thì được sử dụngđể tàng trữ công bố phục vụ cho các thao tác gọi với ghi file. Vùng bộ nhớ lưu trữ tạmlà cần thiết cũng chính vì đặc trưng của ổ đĩa là lắp thêm tất cả triết lý cách xử trí theo kăn năn,điều đó Có nghĩa là ổ đĩa hoạt động kết quả độc nhất vô nhị tác dụng nhất lúc dữ liệu đượcđọc và ghi vào khối hận có size nhất quyết.Mỗi trang bị phần cứng của các hãng sản xuất khác biệt thì tất cả kích thước kân hận tài liệu làkhông giống nhau, nó hoàn toàn có thể có giá trị từ vài ba trăm mang lại vài nghìn bytes. Tuy nhiên thìkhông phải xác định đúng chuẩn kích thước của kăn năn.

RAM links với luồng tài liệu tệp tin đóng góp vaitrò là một trong tiếp xúc thân luồng dữ liệu cùng với phần cứng ổ đĩa. Nlỗi lịch trình sẽghi tài liệu vào luồng, tài liệu sẽ được nghi vào bộ lưu trữ đệm cho đến khi bộ nhớ lưu trữ đệmbị đầy cùng những thực thể câu chữ của bộ nhớ đệm sẽ tiến hành nghi, như một khối, vào ổđĩa. Tiến trình gọi dữ liệu được thực hiện tương tự như nhỏng tiến ghi dữ liệu. Quátrình tạo với cách xử trí của bộ nhớ lưu trữ đệm được thống trị tự động hóa vị hệ điều hành quản lý, lậptrình viên không đề xuất quan tâm cho tới sự việc này. C hỗ trợ một số hàm để gia công việcvới bộ nhớ đệm.

Trong thực tiễn, những xử trí của bộ nhớ lưu trữ đệm xảy ra trongsuốt quá trình xúc tiến lịch trình, nhiều khi hoàn toàn có thể tài liệu mà cmùi hương trìnhghi vào vào ổ đĩa vẫn còn đấy vào bộ nhớ đệm. Nếu lịch trình bị cheo bởi vì mộtnguyên do làm sao đó, trong ngôi trường hợp này có thể dữ liệu chưa bị bị mất, nó có thể vẫnđược lưu lại trong bộ lưu trữ đệm, người sử dụng rất có thể lưỡng lự bởi vì tài liệu kia khôngbao gồm trong ổ đĩa. Dữ liệu phía bên trong bộ đệm cho đến khi tài liệu trong cỗ đệm đượccó tác dụng tươi Hay là được ghi trong thành file vào ổ đĩa.

Luồng dữ liệu được liên kết với file vào thừa trìnhthực hiện cách xử trí phát âm tệp tin. Luồng dữ liệu ngắt gắn kết cùng với file Lúc thực hiệnthao tác làm việc đóng tệp tin. Vị trí bây chừ Khi thao tác cùng với file là địa chỉ mở ra tạithao tác làm việc tiếp theo sau Lúc tiến hành hành động hiểu hoặc ghi tệp tin (Cái này đã đượchiểu rõ nghỉ ngơi các phần tiếp theo).

Có 2 loại luồng dữ liệu : Văn bạn dạng (Text) và nhị phân(binary).

Luồng tài liệu vnạp năng lượng bản là 1 dãy các kí tự(characters).

Một tệp vnạp năng lượng phiên bản rất có thể coi là một luồng dữ liệu các kýtự. Luồng tài liệu vnạp năng lượng bản kết nối cùng với những file vnạp năng lượng bạn dạng. Luồng dữ liệu vnạp năng lượng bảnđược tổ chức thành các mẫu, từng mẫu hoàn toàn có thể tất cả cất một hoặc các các kí tựvà được lưu lại bởi vì cam kết tự quánh nhằm xong xuôi chiếc. Một chiếc tất cả Số lượng kí từ lớnđộc nhất vô nhị là 255 kí trường đoản cú. Chú ý tư tưởng chiếc làm việc đấy là tư tưởng của tệp tin chứ đọng khôngđề nghị knhì niệm string trong C. Lúc một luồng dữ liệu đẳng cấp văn uống bạn dạng được sử dụng,C áp dụng cam kết tự xuống mẫu ‘ ’ và ngẫu nhiên ký từ nào đánh dấu sự chấm dứt dòngmà hệ điều hành quản lý hỗ trợ.

Trong Hệ điều hành Dos áp dụng tổng hợp (CR-LF) nhằm sangchiếc mới. khi dữ liệu được ghi (write) vào file theo chính sách vnạp năng lượng bản, mỗi ‘ ’ sẽauto chuyển đổi thanh lịch CR-LF. trái lại khi đọc (read) tài liệu, mỗi một khi gặp CR-LFnó sẽ tự động chuyển đổi sang trọng ‘ ’. Trong UNIX, sự đổi khác không được thựchiện, Ký từ bỏ xuống chiếc new là ko biến đổi.

Lúc một file tài liệu văn bản được áp dụng, bao gồm nhì kiểubiểu thị ban bố mang lại tài liệu sẽ là : internal(Nội bộ) cùng external (mở rộng). Ví dụ : Giá trị có dạng hình int xét theo khía cạnhnội cỗ (mặt trong) của bao gồm int thì kích thước lưu trữ của nó vẫn là 2 bytes hoặc4 bytes. Nếu xét theo khía cạnh external (msống rộng), thì tài liệu int có thể đượclưu trữ cùng trình diễn dưới dạnh là một trong những xâu ký kết từ bỏ hoặc hoàn toàn có thể là dữ liệu giao diện hexadecimal.

Việc biến hóa tài liệu thân internal và external là siêu dễ ợt. lấy một ví dụ áp dụng printf nhằm thựchiện tại các thao tác làm việc hiển thị công bố và fprintf để ghi thông báo ra tệp tin. Thì printflà 1 ví dụ về internal và fprintf là thay mặt đại diện mang đến external, Việc gửi đổinày được thực hiện liên tiếp. Trong thao tác đọc dữ liệu thì external scanfor fscanf là thay mặt đại diện đến câu hỏi đổi khác thân internal và external.

File nhị phân cất một tập thích hợp những bytes. Trong C, mộtbyte với một ký kết tự (charater) là tương tự. lúc thao tác với tệp tin nhị phân thìcũng trở thành tmê man chiếu tới luông tài liệu nhị phân, so với luồng tài liệu văn bạn dạng thìluồng dữ liệu nhị phân gồm 2 điểm khác:

Thứnhất: Luồng dữ liệu nhị phân là hàng những bytes khớp ứng 1-1bên trên các máy ghi/phát âm. Điều đó có nghĩa là không tồn tại sự đổi khác. Số bytesđược ghi cùng phát âm bằng đúng số bytes nằm tại sản phẩm bên cạnh. Không bao gồm sự phânbóc tách giữa những mẫu và không sử dụng cam kết từ đánh dấu sự xong dòng. Các ký kết tựNULL cùng ký kết trường đoản cú cuối dòng không có sự minh bạch cùng với các cam kết từ bỏ khác.

Thứhai: C ko cấu hình thiết lập cấu trúc bên trên tệp tin nhị phân, cùng việcphát âm và ghi file theo bất kỳ giải pháp như thế nào sẽ được lập trình sẵn viên chọn lọc.

Trong C, xử trí một tệp tin bằng chuyên môn truy cập ngẫunhiên liên quan tới vấn đề dịch chuyển vị trí bây chừ sang địa chỉ thích hợp trongtệp tin trước khi thực hiện những thao tác làm việc đọc/ghi dữ liệu. Vấn đề này chỉ ra rằng một đặcđiểm thứ hai của file nhị phân, tệp tin nhị phân có thể triển khai các làm việc đọc/ghiđôi khi.

lấy ví dụ như tệp tin cơ sở dữ liệu có thể được chế tác và xử lý nhưmột tệp tin nhị phân. Thao tác update một phiên bản ghi (record) tương quan cho tới vấn đề địnhvị vị trí của record, hiểu record vào trong bộ lưu trữ, sửa đổi lên tiếng record,sau cuối là ghi quay trở về record kia vào tệp tin trên ổ đĩa. Các thao tác làm việc này thườngxảy ra trên file nhị phân, mà lại hiếm lúc tìm kiếm thấy trong số vận dụng xử lýtệp tin văn bản.

2. Sử dụng file trong C

Có 4 hành động cơ bản tuyệt nhất đối với file. Các hành độngkia bao gồm:

+Khai báo một biến hóa nhỏ trỏ có dạng hình FILE

+Mnghỉ ngơi tệp tin thông qua hàm fopen nhằm ghi hoặc đọc

+Ghi hoặc phát âm tệp tin (Xử lý file) thông sang 1 hàm làm sao đó

+Sử dụng hàm fcthua trận nhằm đóng góp file.

2.1 Knhị báo lót trỏ kiểu FILE

Bởi do một trong những lượng không giống nhau các file hoàn toàn có thể được sửdụng trong lịch trình. Khi gọi cùng ghi một một số loại file nào đó thì rất cần được xác minh.

Xem thêm: Hướng Dẫn Cách Móc Len: (Ngày 1) Gồm Những Gì? Hướng Dẫn Móc Mũi Ngôi Sao

Vấn đề này được tiến hành trải qua biến hóa nhỏ trỏ trỏ đếnkết cấu file. FILE là 1 trong cấu trúc được knhì báo vào stdio.h . Các thành phần trong cấu trúc FILE được công tác sử dụngtrong số vận động truy cập khác biệt. Tuy nhiên xây dựng viên không duy nhất thiếtbắt buộc quyên tâm cho điều này. Tuy nhiên trước lúc mỗi một file được mnghỉ ngơi, thì cần khaibáo một phát triển thành bé trỏ có dạng hình FILE.

khi hàm fopen() được Gọi, hàm sẽ tạo nên ra một miêu tả củakết cấu tệp tin với tạo thành một bé trỏ trỏ cho kết cấu file kia. Con trỏ này đượcsử dụng vào tất cả các vận động tiếp sau bên trên file. Cú pháp khai báo củacon trỏ có đẳng cấp FILE như sau :

Cú phápFILE *fi le_pointer_name,…;

Trog đó :

Vídụ

FILE*ifp;

FILE*ofp;

Lúc đó bé trỏ ifp và ofp là 2 con trỏ tất cả vẻ bên ngoài tệp tin.

le_pointer_name:Tên bé trỏ gồm mẫu mã FILE.

2.2. Mlàm việc file

Để mtại 1 tệp tin thì họ thực hiện hàm fopen. Cú pháphàm như sau :

FILE*fopen(const char *fname, const char *mode);

Trong số đó :

fname :Tên tệp tin bên trên đĩa.

mode:Kiểu cách xử lý tệp tin.

Vídụ:

FILE *fptr = fopen(“example.txt”, “r”);

Msinh sống tệp để triển khai đọc dữ liệu

Với thao tác làm việc msinh hoạt tệp nhằm triển khai ghi tài liệu, chúng tanắm “r” thành “w”.

Nguyên mẫu hàm fopen vào stdio.h. trong những số đó cũng baocó các hàm cách xử lý file quan trọng không giống. Tên của tệp tin tất cả mẫu mã xâu ký kết tự do vậy*fname vẫn là 1 hằng nhỏ trỏ bao gồm kiểu dáng char. Tên của tệp tin rất cần được xác địnhđúng đắn.

Các tệp tin trong ổ đĩa lúc nào cũng có tên. Tên file đượcđặt theo vẻ ngoài của hệ quản lý và điều hành. Trong DOS, thương hiệu file bao gồm độ nhiều năm từ là một cho 8 kýtự. Với hệ quản lý điều hành Windows cùng Unix thì thương hiệu file bao gồm độ nhiều năm lên đến 256 ký tự.

Tên tệp tin vào C hoàn toàn có thể tất cả đựng băng thông tương đối đầy đủ củatệp tin.

Vídụ:

FILE*fptr = fopen(“c:\examdata\example.txt”, “r”);

Kiểucách xử trí file : Là một trong các xâu ký kết từ bỏ gồm trongdanh sách sau. Nó cách thức biện pháp xử lý so với những tệp tin sẽ mở

Chofile văn bản

*

Bảng hàng đầu : Kiểu xửlý file văn bản

Cho tệp nhị phân

*

Bảng số 2 : Kiểu xửlý file nhị phân

Ví dụ:

charfilename<80>;

FILE*fp;

printf(“Nhậplên tiếng tên file !”);

gets(filename);

fp= fopen(filename,“w”);

2.3. Kiểm tra tác dụng hàm fopen

Hàm fopen trả về một bé trỏ mẫu mã FILE *, bé trỏ trỏmang lại kết cấu FILE với được áp dụng để truy vấn vào file. lúc tệp tin cần yếu mởbởi vì một lý do nào đó hàm fopen đang trả về NULL. Các lý do rất có thể bao gồm :

+ Tên tệp tin bị sai

+ Cố cố kỉnh msinh sống tệp tin trên ổ đĩa, tuy nhiên file đó khôngthể phát âm được.

+ Cố vậy mngơi nghỉ file trên thư mục ko trường tồn bên trên ổđĩa hoặc ổ đĩa không trường thọ.

+ File kia ko được cho phép xử lý làm việc cơ chế ghi hoặc sống chếđộ gọi ...

Ví dụ

FILE*fp = fopen(“data.dat”,“r”);

If(fp== NULL)

printf(“Khôngmlàm việc được data.dat !”);

exit(1);

Sử dụng phép tắc chất vấn hàm fopen với cái giá trị NULL,cách này chưa phải là biện pháp đưa ra đúng đắn nguim nhân vì sao lỗi mở ra.Nhưng có thể hiển thị thông báo lỗi cho những người dùng để tiến hành nỗ lực msống fileđợt tiếp nhữa hoặc ngừng quá trình msinh hoạt file.

2.4. Đóng tệp tin cùng giải pđợi bộ nhớ lưu trữ đệm

Sau Khi ngừng quy trình cách xử lý cùng với file, sử dụnghàm fclose() nhằm triển khai đóng góp file.

Cú pháp:

intfclose(FILE *fp);

Giá trị trả về :

0 : Nếu đóng góp tệp tin thành công

-1: Nếu đóng file bị lỗi

khi công tác chạy, trường hợp hàm main() xong hoặckhi gặp hàm exit() thì cục bộ những luồn tài liệu đã tự động giải pngóng và đóng góp.Thực tế vào một lịch trình dễ dàng ko tốt nhất thiết cần đóng góp file, vì chưng vìkhối hệ thống đã từ đóng góp toàn cục trước lúc hoàn thành lịch trình trước lúc trnghỉ ngơi về hệđiều hành. Tuy nhiên với thiết kế viên, bọn họ sản xuất kiến thức giỏi thực hiện đóngtệp tin khi xong những tiến trình cách xử trí cùng với file.

khi một tệp tin được đóng, bộ lưu trữ đệm đính cùng với tệp tin đang đượcgiải phóng (có tác dụng tươi), Tất cả các luồn thao tác làm việc sẽ tiến hành đóng góp lúc sử dụng hàmfcloseall(). Hàm này có nguim mẫu là fcloseall(void).

Hàm fcloseall sẽ giải pchờ vùng bộ lưu trữ đếm (buffer) gắncùng với luồng báo cáo (stream) với kết quả trả về số những luồng ban bố bị đóng góp.

RAM gắn kết với luồng dữ liệu rất có thể được giảipngóng mà lại không nhất thiết phải đóng nó, bằng phương pháp áp dụng hàm fflush() hoặc hàm fushall().Sử dụng hàm fflush() Lúc bộ nhớ lưu trữ đệm lắp cùng với file là đã làm được ghi vào file trên ổđĩa, trong những khi file kia vẫn sử dụng. Sử dụng hàm fushall() để giải pchờ bộ lưu trữ đệmđến tất cả các luồng ban bố.

Cúpháp

int fflush(FILE *fp);

int flushall(void);

Môtả hàm fflush

Tyêu thích số vẻ ngoài *fp là con trỏ thứ hạng FILE, được trả vềbởi hàm fopen Lúc tệp tin đó đã được msinh sống. Nếu một tệp tin được mlàm việc làm việc cơ chế xử lý ghiban bố (writing), thì fflush sẽ tiến hành ghi thông tin từ bộ nhớ đệm vào ổđĩa. Nếu tệp tin được mở nghỉ ngơi chính sách xử lý đọc thông báo (reading) thì lúc ấy cỗ nhớđệm sẽ bị xóa.

Hàm fflush trả về 0 giả dụ thành công, trả về EOF ví như bịlỗi.

Môtả hàm flushall

Hàm flushall trả về số lượng các luồng dữ liệu đang mởcùng thực hiện giải pngóng bộ lưu trữ đệm cho toàn bộ những luồng dữ liệu đang mlàm việc.