C ghi vào một tập tin văn bản. Làm việc với các tập tin bằng ngôn ngữ C

– so sánh để xác định sự bình đẳng hoặc bất bình đẳng.

Mục đích thực tế của phép liệt kê là xác định một tập hợp các hằng số ký hiệu riêng biệt của một kiểu số nguyên.

Ví dụ sử dụng biến liệt kê:

mo=1, tu, we, th, fr, sa, su ) ngày;

put(“ Nhập ngày trong tuần (từ 1 đến 7) : ”); scanf(“%d”, &t_day);

w_day = su; bắt đầu = tháng;

kết thúc = ngày_ngày -t_day;

printf(“\nThứ Hai là ngày %d trong tuần, \bây giờ là ngày %d.\n\

Cho đến cuối tuần %d ngày (ngày). ”, bắt đầu, t_day, kết thúc);

Kết quả của chương trình: Nhập ngày trong tuần (từ 1 đến 7): 2

Thứ Hai là ngày đầu tiên trong tuần, bây giờ là ngày thứ 2. Còn 5 ngày (ngày) nữa là hết tuần.

18. Tệp bằng ngôn ngữ C

Tệp là một tập hợp dữ liệu nằm trên phương tiện bên ngoài và được coi là một tổng thể duy nhất trong quá trình xử lý. Các tập tin chứa dữ liệu nhằm mục đích lưu trữ lâu dài.

Có hai loại tệp: văn bản và nhị phân. Tệp văn bản là một chuỗi ký tự ASCII và có thể được xem và chỉnh sửa bằng bất kỳ trình soạn thảo văn bản nào.

Tệp nhị phân (nhị phân) là một chuỗi dữ liệu, cấu trúc của nó được xác định bởi phần mềm.

Ngôn ngữ C có một tập hợp lớn các hàm để làm việc với các tệp, hầu hết chúng được tìm thấy trong thư viện stdio.h và io.h.

18.1. Mở một tập tin

Mỗi tệp được gán một tên logic nội bộ, tên này sẽ được sử dụng sau này khi truy cập vào nó. Tên logic (định danh file) là

con trỏ tới tập tin, tức là vào vùng nhớ chứa tất cả thông tin cần thiết về tệp. Định dạng để khai báo một con trỏ tới một tập tin như sau:

FILE * con trỏ tới tập tin;

FILE – mã định danh kiểu cấu trúc được mô tả trong thư viện chuẩn

stdio.h và chứa các thông tin sau:

gõ cấu trúc (

– số byte chưa đọc còn lại trong bộ đệm;

kích thước bộ đệm thông thường là 512 byte; ngay khi cấp độ = 0,

khối dữ liệu tiếp theo được đọc vào bộ đệm từ tệp;

– cờ trạng thái tập tin – đọc, viết, nối thêm;

– mô tả tập tin, tức là con số xác định nó không-

giữ char không dấu;

– ký tự không được truyền đi, tức là ký tự ungetc;

– kích thước của bộ đệm trung gian bên trong;

bộ đệm char không dấu;

– giá trị con trỏ để truy cập bên trong bộ đệm, tức là

chỉ định phần đầu của bộ đệm, đầu dòng hoặc giá trị hiện tại

Giá trị của con trỏ bên trong bộ đệm tùy thuộc vào chế độ

ma đệm;

ký tự không dấu *curp;

– giá trị hiện tại của con trỏ để truy cập bên trong

fera, tức là chỉ định vị trí hiện tại trong bộ đệm trao đổi

tiếp tục với chương trình;

istemp không dấu;

– cờ tập tin tạm thời;

– gắn cờ khi làm việc với một tập tin;

) TÀI LIỆU;

Trước khi bạn bắt đầu làm việc với tệp, tức là. Để có thể đọc hoặc ghi thông tin vào một tập tin, nó phải được mở để truy cập. Với mục đích này, chức năng thường được sử dụng

FILE* fopen(char* file_name, chế độ char*);

nó nhận một biểu diễn bên ngoài - tên vật lý của tệp trên phương tiện (đĩa mềm, ổ cứng) và khớp với tên logic.

Tên vật lý, tức là tên tệp và đường dẫn đến nó được chỉ định bởi tham số đầu tiên

– ví dụ một dòng, “a:Mas_dat.dat” – một tệp có tên Mas_dat.dat nằm trên đĩa mềm, “d:\\work\\Sved.txt” – một tệp có tên Sved.txt nằm trên đĩa cứng ổ đĩa trong thư mục làm việc.

Chú ý! Dấu gạch chéo ngược (\), là ký tự đặc biệt, được viết hai lần trên một dòng.

Khi mở thành công, hàm fopen trả về một con trỏ tới tệp (sau đây gọi là con trỏ tệp). Nếu có lỗi, NULL được trả về. Tình huống này thường xảy ra khi đường dẫn đến tệp cần mở được chỉ định không chính xác. Ví dụ: nếu trong lớp hiển thị của trường đại học của chúng tôi, bạn chỉ định một đường dẫn bị cấm viết (thường là d:\work\ được cho phép).

Tham số thứ hai là dòng chỉ định chế độ truy cập tệp:

w – file được mở để ghi; nếu không có tệp nào có tên đã cho, nó sẽ được tạo; nếu một tệp như vậy tồn tại thì thông tin trước đó sẽ bị hủy trước khi mở;

r – tập tin mở ở chế độ chỉ đọc; nếu không có tệp đó thì sẽ xảy ra lỗi;

a – file được mở để thêm thông tin mới vào cuối;

r+ – tệp được mở để chỉnh sửa dữ liệu – có thể ghi và đọc thông tin;

w+ – giống như đối với r+;

a+ – giống như đối với a, chỉ có thể thực hiện việc ghi ở bất kỳ đâu trong tệp; đọc tập tin cũng có sẵn;

t – tệp mở ở chế độ văn bản; b – tệp mở ở chế độ nhị phân.

Chế độ văn bản khác với chế độ nhị phân ở chỗ khi một tệp được mở dưới dạng văn bản, cặp ký tự “nguồn cấp dòng”, “trả về dòng” được thay thế bằng một ký tự duy nhất: “nguồn cấp dòng” cho tất cả các chức năng ghi dữ liệu vào tệp và đối với tất cả các hàm đầu ra, ký tự “nguồn cấp dữ liệu” " hiện được thay thế bằng hai ký tự: "nguồn cấp dữ liệu", "trả về dòng".

Theo mặc định, tệp sẽ mở ở chế độ văn bản. Ví dụ: TẬP TIN *f; – một con trỏ tới tập tin f được khai báo;

f = fopen("d:\\work\\Dat_sp.cpp", "w"); – một tệp có tên logic f, có tên vật lý Dat_sp.cpp, nằm trên ổ d, trong thư mục công việc, được mở để ghi; hoặc ngắn gọn hơn

FILE *f = fopen("d:\\work\\Dat_sp.cpp", "w");

18.2. Đóng một tập tin

Sau khi làm việc với một tập tin, quyền truy cập vào nó phải được đóng lại. Việc này được thực hiện bằng hàm int fclose (con trỏ tệp). Ví dụ, từ ví dụ trước, tệp được đóng như thế này: fclose (f);

Để đóng nhiều file, một hàm được đưa ra, khai báo như sau: void fcloseall (void);

Nếu bạn cần thay đổi chế độ truy cập cho một tệp, trước tiên bạn phải đóng tệp đó rồi mở lại nhưng với các quyền truy cập khác. Để thực hiện việc này, hãy sử dụng hàm tiêu chuẩn:

FILE* freopen (char*file_name, char *mode, FILE *file_pointer);

Hàm này đầu tiên đóng file đã khai báo con trỏ tập tin(như chức năng fopen thực hiện), sau đó mở tệp với "chế độ" tên tệp và quyền.

Ngôn ngữ C có khả năng làm việc với các tệp tạm thời chỉ cần thiết khi chương trình đang chạy. Trong trường hợp này, chức năng được sử dụng

TẬP_TIN* tmpfile(void);

tạo một tệp tạm thời trên đĩa với quyền truy cập “w+b”; sau khi chương trình hoàn thành hoặc sau khi tệp tạm thời được đóng, nó sẽ tự động bị xóa.

18.3. Viết – đọc thông tin

Tất cả các hành động đọc và ghi dữ liệu vào một tập tin có thể được chia thành ba nhóm: các hoạt động đầu vào-đầu ra theo từng ký tự; hoạt động I/O theo từng dòng; chặn các hoạt động I/O.

Chúng ta hãy xem xét các chức năng chính được sử dụng trong mỗi nhóm trong ba nhóm hoạt động này.

I/O theo từng ký tự

Trong các hàm I/O theo từng ký tự, một ký tự được nhận từ một tệp hoặc một ký tự được gửi đến một tệp:

Hàng vào/ra

Các chức năng I/O dòng truyền từ một tập tin hoặc đến

Chặn I/O

Khối chức năng I/O hoạt động trên toàn bộ khối

thông tin:

int fread (void*p, intsize,

– đọc n khối có kích thước byte từ tập tin

int n, TẬP TIN *f)

la f tới vùng nhớ bằng con trỏ p (bắt buộc

int fwrite (void*p, intsize,

phân bổ bộ nhớ trước cho khối được đọc);

– ghi n khối kích thước byte từ mỗi khối

int n, TẬP TIN *f)

vùng nhớ có con trỏ p tới file f.

I/O được định dạng được tạo ra bởi các hàm.

Tệp văn bản

Hãy xem xét cách làm việc với một tệp văn bản trong C bằng một ví dụ. Tạo một file văn bản trên ổ C có tên TextFile.txt. Nhập các dòng sau vào tệp này:

Chuỗi_1 123 Chuỗi_11, 456
Chuỗi_2
Chuỗi_3

Lưu các tập tin.

Và đây là mã cho chương trình C mở tệp của chúng tôi và đọc các dòng từ nó:

/* *Tác giả: @author Subbotin B.P..h> #include #define LEN 50 int main(void) ( put("Thao tác tệp văn bản"); char cArray; FILE *pTextFile = fopen("C:\\TextFile.txt", "r"); if(pTextFile == NULL) ( đặt("Sự cố"); return EXIT_FAILURE; ) while(fgets(cArray, LEN, pTextFile) != NULL) ( printf("%s", cArray); ) fclose(pTextFile); return EXIT_SUCCESS; )

Để mở tệp văn bản trong C, hãy sử dụng hàm fopen:

TẬP_TIN *pTextFile = fopen("C:\\TextFile.txt", "r");

Đối số đầu tiên của hàm fopen trỏ đến một tệp và đối số thứ hai cho biết rằng tệp đang mở để đọc từ đó.

Chúng tôi đọc các dòng bằng hàm fgets:

fgets(cArray, LEN, pTextFile);

Đối số đầu tiên của hàm fgets trỏ đến một mảng ký tự trong đó các chuỗi nhận được sẽ được lưu trữ, đối số thứ hai là số ký tự tối đa có thể đọc và đối số thứ ba là tệp của chúng ta.

Sau khi làm việc xong với file, bạn cần đóng nó lại:

fclose(pTextFile);

Chúng tôi nhận được:

Các chữ cái tiếng Nga cũng xuất hiện trên dòng chữ.

Nhân tiện, tôi đã tạo chương trình này trong Eclipse. Bạn có thể xem cách làm việc với C/C++ trong Eclipse.

Vì vậy, chúng tôi đã mở và đọc dữ liệu từ một tệp văn bản.

Bây giờ chúng ta sẽ tìm hiểu cách tạo một tệp văn bản và ghi dữ liệu vào đó theo chương trình.

/* Tác giả: @author Subbotin B.P..h> #include int main(void) ( FILE *pTextFile = fopen("C:\\TextFileW.txt", "w"); char *cString = "Đây là một chuỗi"; char cNewLine = "\n"; int nVal = 123 ; if(pTextFile == NULL) (đặt("Sự cố"); return EXIT_FAILURE; ) fprintf(pTextFile, "%s%c", cString, cNewLine); fprintf(pTextFile, "%d", nVal); return EXIT_SUCCESS ; )

Tạo một tệp văn bản để ghi dữ liệu vào:

TẬP_TIN *pTextFile = fopen("C:\\TextFileW.txt", "w");

nếu tệp đã tồn tại, nó sẽ được mở và tất cả dữ liệu trong đó sẽ bị xóa.

Chuỗi cString và số nVal được chương trình ghi vào tệp văn bản. cNewLine chỉ đơn giản là một dòng mới.

Chúng tôi ghi dữ liệu vào tệp văn bản bằng hàm fprintf:

fprintf(pTextFile, "%s%c", cString, cNewLine);

đối số đầu tiên ở đây là file của chúng ta, đối số thứ hai là chuỗi định dạng, đối số thứ ba trở lên là số lượng đối số cần thiết cho định dạng này.

Phần này sẽ thảo luận về hai cách để làm việc với các tệp và lớp MFC CFileDialog tiêu chuẩn.


1. Làm việc với các tệp trong C (cũng hoạt động trong C++)..


    #bao gồm
    #bao gồm

Khoảng trống chính(void)
{
TẬP TIN *tập tin;
char* file_name = "file.txt";
char Load_string = "không có";

Tệp = fopen(tên_tệp, "w");

Fputs("chuỗi", file);

Tệp = fopen(tên_tệp, "r");
nếu (tệp != 0)
{
fgets(load_string, 50 , tập tin);
cout)
khác
{
cout)
fclose(file);
) Mô tả các chức năng làm việc với tập tin có trong thư viện stdio.h
Đầu tiên bạn cần tạo một con trỏ tới một biến kiểu FILE ( TẬP TIN* tập tin;).
Việc mở một tập tin được thực hiện bằng cách gọi hàm fopen ( file = fopen(file_name, "w");)
Tham số đầu tiên của chức năng này là tên tệp, tham số thứ hai chỉ định chế độ mở tệp. "w"- mở để ghi âm, "r"- mở để đọc, "Một"- bổ sung tệp (đây là những chế độ được sử dụng nhiều nhất, mặc dù có những chế độ khác). Việc ghi và đọc dữ liệu từ một tập tin được thực hiện bởi các chức năng sau: fputc, fputs, fgetc, fgets, fprintf, fscanf(để biết mô tả về các chức năng này, xem stdio.h).
Việc đóng một tập tin được thực hiện bằng cách gọi hàm fclose ( fclose(file);).

Làm việc với các tệp bằng MFC (các lớp CFile, CStdioFile, ...) và lớp MFC tiêu chuẩn CFileDialog.


Thư viện MFC bao gồm một số lớp để làm việc với các tệp. Các lớp được thảo luận dưới đây kế thừa từ lớp cơ sở

Tệp C.

Lớp CF

Tệp Cđược thiết kế để làm việc với các tập tin. Nó làm cho các tệp dễ sử dụng hơn bằng cách biểu diễn tệp dưới dạng một đối tượng có thể được tạo, đọc, ghi, v.v.

Để truy cập một file, trước tiên bạn cần tạo một đối tượng của lớp CFile. Hàm tạo của lớp cho phép bạn mở một tệp ngay sau khi tạo một đối tượng như vậy. Nhưng bạn có thể mở tệp sau bằng phương pháp

Mở.

Mở và tạo tập tin

Sau khi tạo đối tượng lớp Tệp Cbạn có thể mở một tập tin bằng cách gọi phương thứcMở. Phương thức phải chỉ định đường dẫn đến tệp cần mở và chế độ sử dụng tệp. nguyên mẫu phương phápMởcó dạng sau:

Mở BOOL ảo(LPCTSTR lpszFileName, UINT nOpenFlags, CFileException* pError=NULL);

Với tham số lpszFileName, bạn phải chỉ định tên của tệp cần mở. Bạn có thể chỉ định tên tệp hoặc tên tệp đầy đủ bao gồm đường dẫn đầy đủ đến nó.

Tham số thứ hai, nOpenFlags, chỉ định hành động mà phương thức Open thực hiện trên tệp, cũng như các thuộc tính của tệp. Dưới đây là một số giá trị có thể có cho tham số nOpenFlags:

  • CFile::modeCreate - Tạo một tập tin mới. Nếu tệp được chỉ định tồn tại, nội dung của nó sẽ bị xóa và độ dài tệp được đặt thành 0.
  • CFile::modeNoTruncate - Tệp này được thiết kế để sử dụng cùng với tệp CFile::modeCreate. Nếu một tệp hiện có được tạo, nội dung của nó sẽ không bị xóa.

  • CFile::modeRea d - Tệp được mở ở chế độ chỉ đọc.
  • CFile::modeReadWrite - Tệp được mở để ghi và đọc.
  • CFile::modeWrite - Tệp chỉ được mở để ghi.
  • CFile::typeText - Được sử dụng bởi các lớp dẫn xuất từ ​​lớp CFile, chẳng hạn như CStdioFile, để làm việc với các tệp ở chế độ văn bản. Chế độ văn bản chuyển đổi sự kết hợp giữa ký tự xuống dòng và ký tự cấp dòng.
  • CFile::Binary - Được sử dụng bởi các lớp dẫn xuất từ ​​lớp CFile, chẳng hạn như CStdioFile, để làm việc với các tệp ở chế độ nhị phân.
  • Tham số tùy chọn pError, là con trỏ tới đối tượng lớp Ngoại lệ CFile, chỉ được sử dụng nếu việc thực hiện một thao tác trên tệp sẽ gây ra lỗi. Trong trường hợp này, thông tin bổ sung sẽ được ghi vào đối tượng được trỏ tới bởi pError.

    Phương pháp Mởtrả về khác 0 nếu tệp đang mở và không có lỗi. Ví dụ: có thể xảy ra lỗi khi mở tệp, nếu phương thức Mở được chỉ định để đọc tệp không tồn tại.

    Mở ID tệp

    Lớp CFile bao gồm phần tử dữ liệu m_hFile kiểu UINT. Nó lưu trữ mã định danh của tập tin đang mở. Nếu một đối tượng của lớp CFile đã được tạo nhưng tệp vẫn chưa được mở thì hằng số hFileNull sẽ được ghi vào biến m_hFile.

    Thông thường, mã định danh tệp đang mở không được sử dụng trực tiếp. Phương thức lớp Tệp Ccho phép bạn thực hiện hầu hết mọi thao tác với tệp và không yêu cầu bạn chỉ định mã nhận dạng tệp. Vì m_hFile là một thành phần lớp nên việc triển khai các phương thức của nó luôn có quyền truy cập miễn phí vào nó.

    Đóng tập tin

    Sau khi làm việc xong với tập tin, nó phải được đóng lại. Lớp học Tệp Ccó một phương thức Đóng đặc biệt cho việc này. Cần lưu ý rằng nếu một đối tượng của lớp CFile được tạo và một tệp được mở, sau đó đối tượng bị xóa, tệp liên quan sẽ tự động bị đóng bằng cách sử dụng hàm hủy.

    Đọc và ghi tập tin

    Có một số phương thức lớp để truy cập tập tin. Tệp C: Đọc, ReadHuge, Viết, WriteHuge, Flush. phương pháp Đọc và đọcLớnđược thiết kế để đọc dữ liệu từ một tập tin đã mở trước đó. Trên hệ điều hành 32 bit, cả hai phương pháp đều có thể đọc đồng thời hơn 65535 byte từ một tệp. Đặc tả ReadHuge được coi là lỗi thời và chỉ được giữ lại để tương thích với hệ điều hành 16 bit.

    Dữ liệu đọc từ tệp được ghi vào bộ đệm lpBuf. Tham số nCount chỉ định số byte được đọc từ tệp. Trên thực tế, có thể đọc được ít byte hơn từ tệp so với yêu cầu của tham số nCount. Điều này xảy ra nếu đến cuối tập tin trong quá trình đọc. Các phương thức trả về số byte được đọc từ tệp.

    Các phương thức Write và WriteHuge được thiết kế để ghi vào một tập tin. Trên hệ điều hành 32 bit, cả hai phương pháp đều có thể ghi đồng thời hơn 65535 byte vào một tệp. Các phương thức ghi byte từ bộ đệm lpBuf vào tệp đang mở nCount. Nếu xảy ra lỗi ghi, chẳng hạn như đĩa đầy, các phương thức sẽ yêu cầu xử lý ngoại lệ.

    Phương pháp xả

    Khi phương thức Write hoặc WriteHuge được sử dụng để ghi dữ liệu vào đĩa, nó có thể vẫn ở trong bộ đệm tạm thời một thời gian. Để đảm bảo rằng những thay đổi cần thiết được thực hiện đối với tệp trên đĩa, bạn cần sử dụng phương pháp Flush.

    Hoạt động tập tin

    Lớp này bao gồm các phương thức cho phép bạn thực hiện nhiều thao tác khác nhau trên tệp, chẳng hạn như sao chép, đổi tên, xóa, thay đổi thuộc tính.

    Để thay đổi tên file, lớp CFile bao gồm một phương thức tĩnh Đổi tên, thực hiện các chức năng của lệnh này. Phương pháp này không thể được sử dụng để đổi tên thư mục. Nếu xảy ra lỗi, phương thức sẽ đưa ra một ngoại lệ.

    Một phương thức tĩnh được bao gồm trong lớp CFile để xóa tệp Di dời, cho phép bạn xóa tệp được chỉ định. Phương pháp này không cho phép bạn xóa thư mục. Nếu không thể xóa tệp, phương thức sẽ đưa ra một ngoại lệ.

    Để xác định ngày và giờ tạo tệp, độ dài và thuộc tính của tệp, một phương thức tĩnh được sử dụng Nhận trạng thái. Có hai loại phương thức - loại thứ nhất được định nghĩa là phương thức ảo và loại thứ hai được định nghĩa là phương thức tĩnh.

    Phiên bản ảo của phương pháp Nhận trạng tháixác định trạng thái mở của tệp được liên kết với đối tượng lớp CFile này. Phương thức này chỉ được gọi khi một đối tượng lớp CFile được tạo và tệp được mở.

    Phiên bản tĩnh của phương pháp Nhận trạng tháicho phép bạn xác định các đặc điểm của tệp không được liên kết với đối tượng của lớp CFile. Để sử dụng phương pháp này, trước tiên không cần thiết phải mở tệp.

    Khóa

    Lớp bao gồm các phương thức Phạm vi khóaMở khóaPhạm vi, cho phép khóa một hoặc nhiều phần dữ liệu tệp để các quy trình khác truy cập. Nếu một ứng dụng cố gắng khóa lại dữ liệu đã bị khóa trước đó bởi ứng dụng này hoặc ứng dụng khác thì một ngoại lệ sẽ được đưa ra. Khóa là một trong những cơ chế cho phép nhiều ứng dụng hoặc tiến trình hoạt động đồng thời trên cùng một file mà không can thiệp lẫn nhau.

    Bạn có thể đặt khóa bằng phương pháp Phạm vi khóa. Để loại bỏ các khóa đã cài đặt, bạn cần sử dụng phương phápMở khóaPhạm vi. Nếu nhiều khóa được đặt trong một tệp thì mỗi khóa phải được giải phóng bằng một lệnh gọi phương thức riêng biệtMở khóaPhạm vi.

    Định vị

    Để di chuyển con trỏ vị trí tệp hiện tại đến một vị trí mới, bạn có thể sử dụng một trong các phương thức lớp sau Tệp C - Tìm kiếm, SeekToBegin, SeekToEnd.Đến lớp Tệp Ccũng bao gồm các phương thức cho phép bạn đặt và thay đổi độ dài tệp, -Nhận chiều dài, đặt chiều dài.

    Khi mở một tập tin, chỉ báo vị trí tập tin hiện tại nằm ở đầu tập tin. Khi một phần dữ liệu được đọc hoặc ghi, con trỏ vị trí hiện tại sẽ di chuyển về phía cuối tệp và trỏ đến dữ liệu sẽ được đọc hoặc ghi trong thao tác đọc hoặc ghi tiếp theo vào tệp.

    Để di chuyển con trỏ vị trí tệp hiện tại đến bất kỳ vị trí nào, bạn có thể sử dụng phương thức phổ quát

    Tìm kiếm. Nó cho phép bạn di chuyển con trỏ một số byte nhất định so với vị trí bắt đầu, kết thúc hoặc vị trí con trỏ hiện tại.

    Để di chuyển con trỏ đến đầu hoặc cuối tệp, cách thuận tiện nhất là sử dụng các phương pháp đặc biệt. Phương pháp

    Tìm kiếm để bắt đầudi chuyển con trỏ đến đầu tệp và phương thứcTìm kiếm để kết thúc- đến cuối cùng.

    Nhưng để xác định độ dài của một file đang mở, không cần thiết phải di chuyển con trỏ của nó. Bạn có thể sử dụng phương pháp

    Nhận chiều dài. Phương thức này cũng trả về độ dài của tệp đang mở tính bằng byte. Phương phápĐặt độ dàicho phép bạn thay đổi độ dài của tệp đang mở. Nếu phương pháp này tăng kích thước tệp, giá trị của byte cuối cùng sẽ không được xác định.

    Vị trí con trỏ tệp hiện tại có thể được xác định bằng phương pháp

    Nhận vị trí. Trả về theo phương thứcNhận vị tríGiá trị 32 bit chỉ định độ lệch con trỏ từ đầu tệp.

    Đặc điểm tệp mở

    Để xác định vị trí của tệp đang mở trên đĩa, bạn cần gọi phương thức GetFilePath. Phương thức này trả về một đối tượng của lớpChuỗi C, chứa đường dẫn đầy đủ của tệp, bao gồm tên ổ đĩa, thư mục, tên tệp và phần mở rộng tệp.

    Nếu bạn chỉ cần xác định tên và phần mở rộng của tệp đang mở, bạn có thể sử dụng phương pháp Lấy tên tệp. Nó trả về một đối tượng CString chứa tên tệp. Trong trường hợp bạn chỉ cần tìm tên của một tệp đang mở không có phần mở rộng, hãy sử dụng phương phápGetFileTitle.

    Phương thức sau đây của lớp CFile cho phép bạn thiết lập đường dẫn tệp. Phương thức này không tạo, sao chép hoặc thay đổi tên tệp; nó chỉ điền phần tử dữ liệu tương ứng vào đối tượng lớp CFile.

    Lớp C

    tập tin ghi nhớ

    Thư viện MFC bao gồm lớp

    CMemFile, kế thừa từ lớp cơ sởTệp C. Lớp học CMemFileđại diện cho một tập tin nằm trong RAM. Với các đối tượng lớpCMemFiletương tự như với các đối tượng lớpTệp C. Sự khác biệt là tập tin liên kết với đối tượngCMemFile, không nằm trên đĩa mà nằm trong RAM của máy tính. Do đó, các thao tác với tệp như vậy sẽ nhanh hơn nhiều so với tệp thông thường.

    Làm việc với các đối tượng lớp

    CMemFile, bạn có thể sử dụng hầu hết tất cả các phương thức của lớpTệp Cđã được mô tả ở trên. Bạn có thể ghi dữ liệu vào một tập tin như vậy hoặc đọc nó. Ngoài các phương thức này, lớp còn chứaCMemFilebao gồm các phương pháp bổ sung.

    Có hai hàm tạo khác nhau để tạo các đối tượng của lớp CMemFile. Hàm tạo CMemFile đầu tiên chỉ có một tham số tùy chọn nGrowBytes:

    CMemFile(UINT nGrowBytes=1024);

    Hàm tạo này tạo một tệp trống trong RAM. Sau khi tạo xong, file sẽ tự động được mở (không cần gọi phương thức Ope

    N).

    Khi việc ghi vào một tập tin như vậy bắt đầu, một khối bộ nhớ sẽ tự động được cấp phát. Để có được các phương thức lớp bộ nhớ

    CMemFilegọi hàm tiêu chuẩnmalloc, reallocmiễn phí. Nếu khối bộ nhớ được phân bổ không đủ, kích thước của nó sẽ tăng lên. Khối bộ nhớ của tệp được tăng lên theo từng phần của byte nGrowBytes. Sau khi xóa một đối tượng lớpCMemFilebộ nhớ đã sử dụng sẽ tự động được trả lại cho hệ thống.

    Hàm tạo thứ hai của lớp CMemFile có nguyên mẫu phức tạp hơn. Hàm tạo này được sử dụng trong trường hợp lập trình viên tự phân bổ bộ nhớ cho tệp:

    CMemFile(BYTE* lpBuffer, UINT nBufferSize, UINT nGrowBytes=0);

    Tham số lpBuffer chỉ định bộ đệm được sử dụng cho tệp. Kích thước bộ đệm được xác định bởi tham số nBufferSize.

    Tham số nGrowBytes tùy chọn được sử dụng toàn diện hơn so với hàm tạo của lớp đầu tiên. Nếu nGrowBytes chứa số 0 thì tệp được tạo sẽ chứa dữ liệu từ lpBuffer. Độ dài của tệp như vậy sẽ bằng nBufferSize.

    Nếu nGrowBytes lớn hơn 0 thì nội dung của lpBuffer sẽ bị bỏ qua. Ngoài ra, nếu nhiều dữ liệu được ghi vào một tệp như vậy hơn mức có thể chứa vừa trong bộ đệm được phân bổ thì kích thước của nó sẽ tự động tăng lên. Khối bộ nhớ của tệp được tăng lên theo từng phần của byte nGrowBytes.

    CMemFilecho phép bạn lấy con trỏ tới vùng bộ nhớ được tệp sử dụng. Thông qua con trỏ này, bạn có thể làm việc trực tiếp với nội dung của tệp mà không bị giới hạn ở các phương thức lớpTệp C. Để lấy con trỏ tới bộ đệm tệp, bạn có thể sử dụng phương thức Detach. Trước khi thực hiện việc này, sẽ rất hữu ích nếu xác định độ dài của tệp (và do đó là kích thước của bộ nhớ đệm) bằng cách gọi phương thứcNhận chiều dài. tách rađóng tệp đã cho và trả về một con trỏ tới khối bộ nhớ mà nó đang sử dụng. Nếu bạn cần mở lại tệp và liên kết khối RAM với nó, bạn cần gọi phương thứcGắn.

    Cần lưu ý rằng để quản lý bộ đệm tệp, lớp

    CMemFilegọi các hàm tiêu chuẩnmalloc, reallocmiễn phí. Vì vậy, để không phá vỡ cơ chế quản lý bộ nhớ, bộ đệm lpBuffer phải được tạo bởi các hàmmalloc hoặc calloc.

    Lớp CStdioFile

    Những người đã quen sử dụng các hàm I/O luồng từ thư viện chuẩn C và C++ nên chú ý đến lớp này

    CStdioFile, kế thừa từ lớp cơ sởTệp C. Lớp này cho phép bạn thực hiện I/O được đệm ở chế độ văn bản và nhị phân. Đối với các đối tượng lớpCStdioFileBạn có thể gọi hầu hết tất cả các phương thức của lớp CFile.CStdioFilebao gồm phần tử dữ liệu m_pStream, chứa con trỏ tới tệp đang mở. Nếu một đối tượng lớpCStdioFileđược tạo nhưng tệp chưa được mở hoặc đóng thì m_pStream chứa hằng số NULL.CStdioFilecó ba hàm tạo khác nhau. Hàm tạo đầu tiên của lớp CStdioFile không có tham số. Hàm tạo này chỉ tạo một đối tượng lớp chứ không mở bất kỳ tệp nào. Để mở một tập tin, bạn cần gọi phương thứcMởlớp cơ sởTệp C.

    Hàm tạo lớp thứ hai

    CStdioFilecó thể được gọi nếu tệp đã được mở và bạn cần tạo một đối tượng mới của lớp CStdioFile và liên kết tệp đang mở với nó. Hàm tạo này có thể được sử dụng nếu tệp được mở bằng hàm tiêu chuẩnfopen. Tham số phương thức phải chứa một con trỏ tới tệp thu được bằng cách gọi hàm tiêu chuẩnfopen.

    Hàm tạo thứ ba có thể được sử dụng nếu bạn cần tạo một đối tượng lớp

    CStdioFile, mở một tệp mới và liên kết nó với đối tượng mới được tạo.

    Để đọc và ghi vào một tập tin văn bản, lớp CStdioFile bao gồm hai phương thức mới:

    Đọc chuỗiViết chuỗi. Phương thức đầu tiên cho phép bạn đọc một chuỗi ký tự từ một tệp và phương thức thứ hai cho phép bạn ghi nó.

    Ví dụ về ghi và đọc từ một tập tin

    Dưới đây là các đoạn mã minh họa cách sử dụng bảng hộp thoại chọn tệp tiêu chuẩn và quy trình đọc và ghi vào tệp.

    Mở một tập tin và đọc từ nó

    CString m_Text; …… // tạo bảng chọn file chuẩn Open CFileDialog DlgOpen(TRUE,(LPCSTR)"txt",NULL, OFN_HIDEREADONLY,(LPCSTR)" Tệp văn bản (*.txt) |*.txt||"); // hiển thị bảng chọn file chuẩn Open if(DlgOpen.DoModal()==IDOK) ( // tạo một đối tượng và mở file để đọc Tệp CStdioFile(DlgOpen.GetPathName(),CFile::modeRead|CFile::typeBinary); // đọc chuỗi từ file CString& ref=m_Text; File.ReadString(ref ); // một tham chiếu đến một chuỗi được truyền m_Text)

    Mở và ghi từ một tập tin

    CString m_Text; …… // tạo bảng chọn file SaveAs chuẩn CFileDialog DlgSaveAs(FALSE,(LPCSTR)"txt",NULL, OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT, (LPCSTR)" Tệp văn bản (*.txt) |*.txt||"); // hiển thị bảng chọn file SaveAs chuẩn if(DlgSaveAs.DoModal()==IDOK) ( // tạo một đối tượng và mở một file để ghi Tệp CStdioFile(DlgSaveAs.GetPathName(), CFile::modeCreate|CFile::modeWrite|CFile::typeBinary); // ghi vào file chuỗi File.WriteString((LPCTSTR)m_Text); )
      chứa mã làm việc của chương trình, được thiết kế để đơn giản như một ứng dụng bảng điều khiển trong MFC. Để chương trình hoạt động, đừng quên làm như sau:

      Chạy chương trình - Build/Rebuild toàn bộ (sẽ có lỗi), chọn Build/Set active config - Win 32 Realise, chọn mục menu "Project", sau đó chọn "Settings...", tab "C/C++", Danh mục - Tạo mã và Trong mục "Sử dụng thư viện thời gian chạy", chọn "Đa luồng". Sau đó, thực hiện Build/Rebuild lại tất cả và chương trình sẽ hoạt động.

    Hàm fopen() mở một luồng để sử dụng, liên kết một tệp với luồng đó và sau đó trả về một con trỏ FILE cho luồng đó. Thông thường, tệp được coi là tệp đĩa. Hàm fopen() có nguyên mẫu sau:

    FILE *fopen(const char *tên tệp, const char *mode);

    Trong đó chế độ trỏ đến một chuỗi chứa chế độ mong muốn để mở tệp. Các giá trị hợp lệ cho chế độ trong Borland C++ được hiển thị trong bảng. tên tệp phải là một chuỗi ký tự cung cấp tên tệp hợp lệ cho hệ điều hành và có thể chứa tên đường dẫn.

    Hàm fopen() trả về một con trỏ tới kiểu cơ sở FILE. Con trỏ này xác định tệp và được sử dụng bởi hầu hết các chức năng của hệ thống tệp. Bạn không bao giờ nên tự mình thay đổi nó. Hàm trả về một con trỏ rỗng nếu file không thể mở được.

    Như bảng hiển thị, tệp có thể được mở ở chế độ văn bản hoặc nhị phân. Ở chế độ văn bản, khi bạn nhập, chuỗi trả về đầu dòng và nguồn cấp dữ liệu dòng sẽ được dịch thành ký tự dòng mới. Ở đầu ra, điều ngược lại là đúng: ký tự dòng mới được dịch thành dấu xuống dòng và nguồn cấp dòng. Bản dịch này không xảy ra trong các tệp nhị phân. Khi cả t và b đều không được chỉ định trong đối số mode thì trạng thái văn bản/nhị phân của tệp được xác định bởi giá trị của biến toàn cục _fmode được xác định trong Borland C++. Theo mặc định, fmode được đặt thành O_TEXT, nghĩa là chế độ văn bản được đặt. Nếu bạn đặt _fmode thành O_BINARY thì các tệp sẽ được mở ở chế độ nhị phân. (Các macro này được xác định trong fcntl.h.) Đương nhiên, việc sử dụng t hoặc b rõ ràng sẽ loại bỏ các hiệu ứng liên quan đến biến _fmode. Ngoài ra, _fmode chỉ dành riêng cho các sản phẩm của Borland. Nó không được định nghĩa trong hệ thống ANSI C I/O.

    Nếu bạn cần mở một file có tên test để viết, bạn nên viết:

    Fp = fopen("kiểm tra", "w");

    Trong đó fp là một biến kiểu FILE *. Tuy nhiên, người ta thường thấy những điều sau:

    If((fp = fopen("test", "w"))==NULL) (
    put("Không thể mở tập tin.");
    thoát (1);
    }

    Phương pháp này cho phép bạn phát hiện lỗi khi mở tệp, chẳng hạn như sự hiện diện của tính năng bảo vệ ghi hoặc thiếu dung lượng trống trên đĩa.

    Nếu fopen() được sử dụng để mở tệp để ghi thì mọi tệp có sẵn có tên được chỉ định sẽ bị xóa. Nếu tệp có tên được chỉ định không tồn tại, nó sẽ được tạo.

    Nếu cần thêm thông tin vào cuối file thì nên sử dụng chế độ a (append). Nếu tập tin không tồn tại, nó sẽ được tạo.

    Việc mở một tập tin để đọc cần có sự hiện diện của tập tin đó. Nếu file không tồn tại sẽ trả về lỗi. Nếu một tệp được mở để thực hiện thao tác đọc/ghi thì nó sẽ không bị xóa nếu nó tồn tại và nếu tệp không tồn tại thì nó sẽ được tạo.

    Bảng: Giá trị chế độ cho phép

    Nghĩa

    Mở một tập tin để đọc. (Mở theo mặc định dưới dạng tệp văn bản.)

    Tạo một tập tin để ghi vào. (Mở theo mặc định dưới dạng tệp văn bản.)

    Đính kèm vào một tập tin. (Mở theo mặc định dưới dạng tệp văn bản.)

    Mở một tệp nhị phân để đọc.

    Mở một tệp nhị phân để ghi.

    Đính kèm vào một tập tin nhị phân.

    Mở một tập tin để đọc/ghi. (Mở theo mặc định dưới dạng tệp văn bản.)

    Tạo một tập tin đọc/ghi. (Mở theo mặc định dưới dạng tệp văn bản.)

    Đính kèm hoặc tạo tệp đọc/ghi. (Mở theo mặc định dưới dạng tệp văn bản.)

    Mở một tệp nhị phân để đọc/ghi.

    Tạo một tệp nhị phân đọc/ghi.

    Đính kèm hoặc tạo tệp nhị phân đọc/ghi.

    Tạo một tập tin văn bản để viết.

    Đính kèm vào một tập tin văn bản.

    Mở một tập tin văn bản để đọc.

    Tạo một tập tin văn bản để đọc/ghi.

    Mở hoặc tạo một tệp văn bản để đọc/ghi.