Cách mở tệp bằng hàm C. Làm việc với các tập tin văn bản

Chúng ta đã học cách ghi thông tin vào một tệp văn bản. – Nếu bạn chưa học được cách thực hiện, hãy xem bài viết trước. Nó được kể và mô tả chi tiết

Nhưng nếu tệp đã tồn tại và chúng ta cần đọc thông tin từ nó để xử lý thì sao? May mắn thay, điều này cũng khá đơn giản. Hãy để tôi nhắc bạn rằng có một số lựa chọn để thực hiện nhiệm vụ này; tôi chỉ mô tả một trong số đó. Điều được mô tả là điều mà vì lý do nào đó đối với cá nhân tôi, điều đó có vẻ dễ hiểu nhất.

#bao gồm

int chính()
{
ký tự s1 //Biến sẽ đọc chuỗi
ifstream trong (“C:\\\FromC\\myfile.txt” ); //Mở file để đọc thông tin
trong >>s1 ; //đọc dòng
in.close() //Đóng tập tin

cout<Xuất giá trị s1đến màn hình
trả về 0;
}

Đây là chương trình đơn giản nhất để đọc dòng đầu tiên từ tệp văn bản nằm dọc theo đường dẫn
C:\\\FromC\\myfile.txt –
Vì đây là phần tiếp theo của bài viết trước nên tôi quyết định sử dụng tệp mà chúng tôi đã tạo ở đó. Có lẽ sẽ không có bất kỳ khó khăn nào với việc này.
Nhưng hãy quay lại với đoạn mã. Đầu tiên chúng ta mở tệp để đọc thông tin từ nó, để làm điều này, chúng ta sử dụng lệnh nếu dòng trong ngoặc, chúng tôi chỉ ra tên tệp hoặc đường dẫn đến tệp, như tôi đã làm. (“C:\\\FromC\\myfile.txt” );
Khi chúng tôi mở một tệp để đọc nội dung nào đó từ nó, chúng tôi đã khai báo một biến như char –
char s1
Bây giờ tất cả những gì chúng ta phải làm là gán cho biến giá trị của chuỗi từ tệp. Chúng tôi làm điều này như một đội TRONG
Chú ý đến các dấu ngoặc nhọn trong >>
Trên thực tế, như đã nói rõ trong các nhận xét về mã chương trình, để biến có thể gán giá trị đọc, chúng ta phải viết nó sau trong >>
trong >>s1 ;

Đây dường như không phải là một nhiệm vụ đặc biệt khó khăn, đặc biệt nếu bạn đã thành thạo và học cách sử dụng tài liệu từ bài viết trước - mọi thứ hoàn toàn giống nhau, chỉ có 2 lệnh khác nhau

Tạo một tệp và ghi thông tin C++ vào nó

ngoài dòng ngoài ( Tên tập tin );
ngoài<< (Chuỗi cần viết);
ngoài.đóng();
=============================

Đọc văn bản từ tệp và in văn bản ra màn hình trong C++

nếu dòng TRONG (Tên tệp );
TRONG>> (Đọc dòng);
TRONG.đóng();(Đóng tập tin)
============================
Hãy viết một chương trình đơn giản để đọc văn bản nhập từ bàn phím và ghi nó vào một tệp:

#bao gồm
#bao gồm

int chính()
{
\\ 3 dòng tương lai
clrscsr(); // Xóa màn hình

cout<<“Wwedi pervuu stroku” ; cin >>a ; cuối cùng ;
cout<<“Wwedi wtoruu stroku” ; cin >>b ; cuối cùng ;
cout<<“Wwedi tretuu stroku” ; cin >>c ; cuối cùng ;
clrscr(); //

/*Bắt đầu làm việc với file*/
ofstream out (“C:\\\FromC\\myfile.txt” ); //Mở một tập tin để viết
ngoài<Viết dòng đầu tiên
ngoài<Viết dòng thứ hai
ngoài<Viết dòng thứ ba
out.close(); //Đóng tập tin

//Đặt lại biến

vì (int i =0 ;i<=255 ;i ++)
(a =*“” ; b =*“” ; c =*“” ;)


ifstream trong (“C:\\\FromC\\myfile.txt” );
trong >>a >>b >>c ; //Chúng tôi đọc mỗi dòng mới vào một biến mới
ghim theo(); //Đóng tập tin

/* */

cho (i =0 ;a !=*“” ;i ++)
{
nếu (i >sizeof(a )) phá vỡ ;
cout<

}
cout<<“\n” ; \\

/* */


{
nếu (i >sizeof(b)) phá vỡ ;
cout<
}
cout<<“\n” ; \\ Đã di chuyển con trỏ sang dòng mới

/* */

vì (i =0 ;с !=*“” ;i ++)
{
nếu (i >sizeof(c )) phá vỡ ;
cout<<с ;
}

trả về 0;
}
===================

Trong các ví dụ trên có một ví dụ như vậy TO LỚN lỗ hổng. Nếu chúng ta cố gắng nhập một dòng chứa khoảng trắng, chương trình sẽ không hoạt động như chúng ta cần. Chắc hẳn không chỉ riêng tôi mà nhiều người khác cũng gặp phải lỗi này. Vì vậy, tôi để lại mã không chính xác để bạn có thể xem những gì bạn có thể gặp phải.

Vì ở nhà không có sách nên tôi lại bắt đầu lùng sục trên Internet và tìm thấy rất nhiều thứ vô nghĩa phức tạp. Nhưng bằng cách nào đó tôi đã tìm ra giải pháp cho vấn đề của mình.
Nó đã giúp tôi đọc nó coutủng hộ phương pháp của mình. Và trên Internet, mọi lời khuyên đều hướng tới việc sử dụng chức năng theo hàng Thật may mắn cho tôi, tôi đã nhanh chóng tìm ra cách sử dụng chức năng này và sau đó sử dụng nó trong mã.
Nói chung là đáng nói và mô tả chức năng này, nhưng đến giờ mình cũng chưa hiểu lắm, chỉ hiểu là nó cần được sử dụng và mình hiểu cách sử dụng nên mình sẽ đưa ra một ví dụ chính xác hơn về chương trình của mình đang được phát triển :

#bao gồm
#bao gồm

int chính()
{
ký tự a,b,c; \\ 3 dòng tương lai
clrscsr(); // Xóa màn hình

/*Nhập giá trị cho biến*/

cout<<“Wwedi pervuu stroku” ; cin.getline(a,sizeof(a)); cuối cùng ;
cout<<“Wwedi wtoruu stroku” ; cin.getline(a,sizeof(b)); cuối cùng ;
cout<<“Wwedi tretuu stroku” ; cin.getline(a,sizeof(c)); cuối cùng ;
clrscr(); //Sau khi nhập giá trị, màn hình sẽ bị xóa

/*Bắt đầu làm việc với file*/
ofstream out (“C:\\\FromC\\myfile.txt”); // Mở một tập tin để viết
ngoài<
Viết dòng đầu tiên
ngoài<Viết dòng thứ hai
ngoài<Viết dòng thứ ba
out.close(); //Đóng tập tin

//Đặt lại biến

vì (int i =0 ;i<=255 ;i ++)
(a =*“” ; b =*“” ; c=*“” ;)

/*Tiếp tục làm việc với tập tin*/

nếu truyền vào (“C:\\\FromC\\myfile.txt” );
in.getline(a,sizeof(a));// MỘT
in.getline(b,sizeof(b));// Đọc một dòng vào một biến b
in.getline(c,sizeof(c)); // Đọc một dòng vào một biến c
ghim theo(); //Đóng tập tin

/* Ta đọc từng ký tự dòng đầu tiên và hiển thị ra màn hình */

cho (i =0 ;a !=*“” ;i++)
{
nếu (i >sizeof(a )) phá vỡ ;
cout<

}
cout<<“\n” ; \\ Đã di chuyển con trỏ sang dòng mới

/* Chúng ta đọc từng ký tự dòng thứ 2 và hiển thị ra màn hình */

cho (i =0 ;b !=*“” ;i ++)
{
nếu (i >sizeof(b)) phá vỡ ;
cout<
}
cout<<“\n” ; \\ Đã di chuyển con trỏ sang dòng mới

/* Chúng ta đọc từng ký tự dòng thứ ba và hiển thị trên màn hình */

cho (i =0 ;с !=*“” ;i++)
{
if (i>sizeof (c )) phá vỡ ;
cout<<с[i];
}

getch(); \\Đang chờ nhấn phím Enter
trả về 0;
}
===================

Tài liệu này mô tả một ví dụ về cách đọc thông tin theo từng ký tự. Vì tôi không mô tả cách làm việc với các biến như ký tự, thì người mới bắt đầu có thể gặp một số bất tiện trong việc hiểu mã. Tôi chỉ không biết loại nào ký tự có một số đặc thù và nghĩ rằng mọi thứ đều đơn giản hơn. Vì vậy, một số khoảnh khắc khó hiểu của chương trình trên có thể được đọc trong bài viết sau làm việc với char V. C++ cho người mới bắt đầu

Mặt khác, ví dụ đã cho về cách đọc dòng từ tệp văn bản trong C++ sẽ dễ hiểu và dễ hiểu. Đây không phải là tùy chọn triển khai tối ưu ngay bây giờ và tôi đã bỏ lỡ một số điểm quan trọng, nhưng vì chúng ta đang bắt đầu học ngôn ngữ C++ nên hiện tại điều này là khá đủ. Sau này có lẽ tôi sẽ đạt được những gì tôi đã bỏ lỡ, nhưng bây giờ tôi chỉ cần nhận thức những điều cần thiết nhất.

Nếu bạn và tôi hiểu tài liệu này, điều đó có nghĩa là chúng tôi đã tiến được một bước nhỏ hướng tới tính chuyên nghiệp của mình.

Ghi chú:
phá vỡ ;– Đây là lệnh thoát khỏi vòng lặp. Chúng ta có nếu bộ đếm chu kỳ trở nên lớn hơn kích thước khai báo của biến char, sau đó chúng tôi buộc phải thoát khỏi vòng lặp
!= – Đây là điều kiện chúng tôi đặt ra. Điều kiện này được biểu thị bằng sự bất đẳng thức
nếu(a !=b )– Đọc như thể Một không công bằng b

cuối cùng ; –Điều này đang di chuyển con trỏ đến một dòng mới bên trong bảng điều khiển (theo như tôi hiểu)
Lệnh này tương tự như "\N"

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ừ nó.

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.

Làm việc với các tập tin văn bản trong C++.

Có hai loại tệp chính: văn bản và nhị phân. Tệp cho phép người dùng đọc lượng lớn dữ liệu trực tiếp từ đĩa mà không cần phải nhập dữ liệu từ bàn phím.

    Chữ các tập tin bao gồm bất kỳ ký tự nào được gọi. Chúng được tổ chức thành các dòng, mỗi dòng kết thúc bằng một ký tự cuối dòng. Bản thân phần cuối của tệp được biểu thị bằng ký hiệu "cuối tệp". Khi ghi thông tin vào tệp văn bản, tệp này có thể được xem bằng bất kỳ trình soạn thảo văn bản nào, tất cả dữ liệu sẽ được chuyển đổi thành loại ký tự và được lưu trữ ở dạng ký tự.

    TRONG nhị phân Trong các tệp, thông tin được đọc và ghi dưới dạng các khối có kích thước nhất định, trong đó dữ liệu thuộc bất kỳ loại và cấu trúc nào có thể được lưu trữ.

Để làm việc với các tập tin, đặc biệt Loại dữ liệu, gọi điện dòng. Chảy nếu dòngđược sử dụng để làm việc với các tập tin ở chế độ đọc và ngoài dòngở chế độ ghi. Để làm việc với các tập tin ở cả chế độ ghi và đọc, một luồng được sử dụng dòng chảy.

Trong các chương trình C++, khi làm việc với các tệp văn bản, bạn phải bao gồm thư viện iostream và fstream.

Để viết ra dữ liệu vào một tệp văn bản, bạn cần:

    mô tả một biến thuộc loại dòng.

    xuất thông tin ra file.

    hãy chắc chắn đóng tập tin.

đọc dữ liệu từ một tệp văn bản, bạn cần:

    mô tả một biến kiểu ifstream.

    mở một tập tin bằng chức năng mở.

    đóng tập tin.

Ghi thông tin vào một tập tin văn bản

    Như đã đề cập trước đó, để bắt đầu làm việc với một tệp văn bản, bạn cần xác định một biến thuộc loại dòng. Ví dụ như thế này:

    Biến F sẽ được tạo để ghi thông tin vào file.

    Ở giai đoạn tiếp theo, tập tin phải được mở để ghi. Nói chung, toán tử mở luồng sẽ trông như sau:

F.open("tập tin", chế độ);

Ở đây F là một biến được mô tả là ofstream,

tập tin - tên đầy đủ của tập tin trên đĩa,

chế độ - chế độ làm việc với tệp đang được mở.

Xin lưu ý rằng khi chỉ định tên file đầy đủ, bạn phải sử dụng dấu gạch chéo kép. Ví dụ: tên đầy đủ của tệp noobs.txt, nằm trong thư mục trò chơi trên ổ D:, sẽ cần được viết như sau:

D:\\game\\noobs.txt.

Tệp có thể được mở ở một trong các chế độ sau:

ios::in - mở file ở chế độ đọc dữ liệu, chế độ này là chế độ mặc định cho ifstreams;

ios::out - mở tệp ở chế độ ghi dữ liệu (trong trường hợp này, thông tin về tệp hiện có bị hủy), chế độ này là chế độ mặc định cho luồng;

ios::app - mở tệp ở chế độ ghi dữ liệu vào cuối tệp;

ios::ate - di chuyển đến cuối tệp đã mở;

ios::trunc - xóa tệp, điều này cũng xảy ra ở chế độ ios::out;

ios::nocreate - không mở tệp nếu nó không tồn tại;

ios::noreplace - không mở tệp hiện có.

Tham số chế độ có thể vắng mặt, trong trường hợp đó tệp được mở ở chế độ mặc định cho luồng này.

Sau khi mở file thành công (ở chế độ bất kỳ), biến F sẽ lưu giá trị true, ngược lại là false. Điều này sẽ cho phép bạn kiểm tra tính chính xác của thao tác mở tệp.

Bạn có thể mở một tệp (hãy lấy tệp D:\\game\\noobs.txt làm ví dụ) ở chế độ ghi theo một trong các cách sau:

// Đầu tiên đường

của dòng F;

F.open("D:\\game\\noobs.txt", ios::out);

//phương thức thứ hai, chế độ ios::out là chế độ mặc định

// chảyngoài dòng

của dòng F;

// phương thức thứ ba kết hợp mô tả biến và kiểu luồng

// và mở tệp bằng một câu lệnh

ofstream F("D:\\game\\noobs.txt", ios::out);

Sau khi mở tệp ở chế độ ghi, một tệp trống sẽ được tạo để bạn có thể ghi thông tin vào đó.

Nếu bạn muốn mở một tệp hiện có ở chế độ ghi đầu tiên, bạn nên sử dụng chế độ ios::app.

Sau khi mở tệp ở chế độ ghi, bạn có thể ghi vào tệp đó theo cách tương tự như trên màn hình, chỉ thay vì thiết bị đầu ra tiêu chuẩncoutbạn phải chỉ định tên của tệp đang mở.

Ví dụ: để ghi biến a vào luồng F, câu lệnh đầu ra sẽ như sau:

Để đầu ra tuần tự ra luồng G của các biến b, c, d, toán tử đầu ra sẽ trở thành như sau:

G<

Việc đóng luồng được thực hiện bằng toán tử:

VÍ DỤ:

Tạo một tệp văn bản D:\\game\\noobs.txt và viết n số thực vào đó.

#include "stdafx.h"

#bao gồm

#bao gồm

#bao gồm

sử dụng không gian tên std;

int chính()

setlocale(LC_ALL, "RUS");

int tôi, n;

gấp đôi;

// mô tả luồng ghi dữ liệu vào file

ngoài dòng f;

//mở file ở chế độ ghi,

//cách thứcios:: ngoàiđược cài đặt theo mặc định

f.open("D:\\game\\noobs.txt", ios::out);

//nhập số số thực

cout<<" N="; cin>> N;

//vòng lặp nhập số thực

// và ghi chúng vào một tập tin

với (i=0; tôi

cout<<"a=";

//Nhập một số

cin>>a;

f<

//đóng luồng

f.close();

hệ thống ("tạm dừng");

trả về 0;

_______________________________________________________________

Để đọc thông tin từ tệp văn bản, bạn cần mô tả một biến như nếu dòng. Sau này, bạn cần mở tệp để đọc bằng toán tử mở. Nếu biến được gọi là F thì hai câu lệnh đầu tiên sẽ như sau:

F.open("D:\\game\\noobs.txt", ios::in);

Sau khi mở tệp ở chế độ đọc, bạn có thể đọc thông tin từ tệp đó giống như từ bàn phím, chỉ thay vìcinchỉ định tên của luồng mà dữ liệu sẽ được đọc.

Ví dụ: để đọc từ luồng F vào biến a, câu lệnh đầu vào sẽ như sau:

Hai số trong trình soạn thảo văn bản được coi là tách biệt nếu có ít nhất một trong các ký tự giữa chúng: dấu cách, tab, cuối dòng. Thật tốt nếu lập trình viên biết trước có bao nhiêu và giá trị nào cần lưu trữ trong tệp văn bản. Tuy nhiên, thường loại giá trị được lưu trữ trong tệp được biết đơn giản nhưng số lượng của chúng có thể khác nhau. Để giải quyết vấn đề này, bạn cần đọc từng giá trị từ tệp một lần và trước mỗi lần đọc, hãy kiểm tra xem đã đến cuối tệp chưa. Có một chức năng cho việc này F. ôi().

Ở đây F là tên của thread, hàm trả về giá trị Boolean: true hoặc false, tùy thuộc vào việc có đến cuối file hay không. Do đó, một vòng lặp để đọc nội dung của toàn bộ tệp có thể được viết như sau:

//tổ chức đọc giá trị từ file, thực thi

//vòng lặp sẽ ngắt khi chúng ta đến cuối tập tin,

// trong trường hợp này F.eof() sẽ trả về true

trong khi (!F.eof())

VÍ DỤ:

Tệp văn bản D:\\game\\noobs.txt lưu trữ số thực, hiển thị trên màn hình và tính số của chúng.

#include "stdafx.h"

#bao gồm

#bao gồm

#bao gồm

#bao gồm

sử dụng không gian tên std;

int chính()

setlocale(LC_ALL, "RUS");

int n=0;

thả nổi một;

dòng chảy F;

//mở file ở chế độ đọc

F.open("D:\\game\\noobs.txt");

// nếu file được mở đúng cách thì

//vòng lặp đọc giá trị từ file; việc thực hiện vòng lặp sẽ bị gián đoạn,

// khi đến cuối file, trong trường hợp này F.eof() sẽ trả về true.

trong khi (!F.eof())

//đọc giá trị tiếp theo từ luồng F vào biến a

F>>a;

//xuất giá trị của biến a ra màn hình

cout<

// tăng số lượng số đọc

//đóng luồng

F.close();

//nhập ra màn hình số lượng vừa đọc được

cout<<"n="<

//nếu việc mở tệp không chính xác thì kết quả đầu ra

// thông báo về sự vắng mặt của tập tin đó

cách khác<<" Файл не существует"<

hệ thống ("tạm dừng");

trả về 0;

C++. Xử lý tệp nhị phân

Khi ghi thông tin vào tệp nhị phân, các ký tự và số được ghi dưới dạng một chuỗi byte.

Để viết ra dữ liệu sang tệp nhị phân, bạn cần:

    mô tả một biến tệp thuộc loại FAIL * bằng cách sử dụng toán tử FILE *filename;. Ở đây tên tệp là tên của biến nơi con trỏ tới tệp sẽ được lưu trữ.

    ghi thông tin vào một tập tin bằng hàm fwrite

Để đếm b dữ liệu từ tệp nhị phân, bạn cần:

    mô tả một biến kiểu FILE *

    mở file bằng hàm fopen

    đóng một tập tin bằng hàm fclose

Các hàm cơ bản cần có để làm việc với tệp nhị phân.

khám phá Tệp này được dành cho chức năng fopen.

TẬP_TIN *fopen(const *tên tệp, const char *chế độ)

Ở đây tên file là một chuỗi lưu tên đầy đủ của file đang được mở, mode là một chuỗi xác định chế độ làm việc với file; có thể có các giá trị sau:

“rb” - mở tệp nhị phân ở chế độ đọc;

“wb” - tạo một tệp nhị phân để ghi; nếu nó tồn tại, nội dung của nó sẽ bị xóa;

“ab” - tạo hoặc mở tệp nhị phân để thêm vào cuối tệp;

“rb+” - mở tệp nhị phân hiện có ở chế độ đọc-ghi;

“wb+” - mở tệp nhị phân ở chế độ đọc-ghi, tệp hiện có sẽ bị xóa;

"ab+" - một tệp nhị phân được mở hoặc tạo để sửa thông tin hiện có và thêm thông tin mới vào cuối tệp.

Hàm trả về NULL trong biến tệp f nếu tệp mở không thành công. Sau khi mở một tệp, byte thứ 0 của nó có sẵn, con trỏ tệp là 0, giá trị của nó khi được đọc hoặc ghi sẽ được dịch chuyển theo số byte được đọc (được ghi). Giá trị hiện tại của con trỏ tệp là số byte mà thao tác đọc hoặc ghi sẽ diễn ra.

đóng cửa tập tin được dành cho chức năng fclose

int fclose(TẬP TIN *tên tệp);

Trả về 0 nếu tệp được đóng thành công, nếu không thì trả về NULL.

Chức năng loại bỏ là dành cho gỡ bỏ các tập tin.

int xóa(const char *tên tệp);

Hàm này xóa một tập tin có tên filenema khỏi đĩa. Tập tin cần xóa phải được đóng lại. Hàm trả về giá trị khác 0 nếu không thể xóa tệp.

đổi tên tập tin, chức năng đổi tên được dự định:

int đổi tên(const char *oldfilename, const char *newfilename);

Tham số đầu tiên là tên tệp cũ, tham số thứ hai là tên mới. Trả về 0 nếu chương trình kết thúc thành công.

Đọc từ một tệp nhị phân được thực hiện bằng hàm fread:

fread(void *ptr, size, n, FILE *filename);

Hàm fread đọc n phần tử có kích thước từ tên tệp vào một mảng ptr. Hàm trả về số phần tử đã đọc. Sau khi đọc từ một tập tin, con trỏ của nó được dịch chuyển bởi byte có kích thước n*.

Ghi sang tệp nhị phân được thực hiện bằng hàm fwrite:

fwrite(const void *ptr, size, n, FILE *tên tệp);

Hàm fwrite ghi vào tên tệp từ một mảng ptr gồm n phần tử có kích thước. Hàm trả về số phần tử đã viết. Sau khi ghi thông tin vào tệp, con trỏ sẽ được dịch chuyển theo byte có kích thước n*.

kiểm soát cuối tập tin có một hàm feof:

int feof(FILE *tên file);

Nó trả về giá trị khác 0 nếu đến cuối tệp.

VÍ DỤ:

Tạo một tệp nhị phân D:\\game\\noobs.dat và viết n số nguyên và n số thực vào đó.

#include "stdafx.h"

#bao gồm

sử dụng không gian tên std;

int chính()

setlocale(LC_ALL, "RUS");

int n, tôi;

gấp đôi;

//tạo file nhị phân ở chế độ ghi

f=fopen("D:\\game\\noobs.dat", "wb");

// đầu vào con sốN

cout<<"n="; cin>>n;

fwrite(&n, sizeof(int), 1, f);

//vòng lặp nhập n số thực

với (i=0; tôi

//nhập số thực tiếp theo

cout<<"a=";

cin>>a;

//ghi số thực vào file nhị phân

fwrite(&a, sizeof(double), 1, f);

// đóng tài liệu

fclose(f);

hệ thống ("tạm dừng");

trả về 0;

VÍ DỤ:

Hiển thị nội dung file nhị phân D:\\game\\noobs.dat đã tạo ở tác vụ trước

#include "stdafx.h"

#bao gồm

sử dụng không gian tên std;

int chính()

setlocale(LC_ALL, "RUS");

int n, tôi;

gấp đôi;

TẬP TIN *f; // mô tả biến tập tin

// mở tệp nhị phân hiện có ở chế độ đọc

//đọc một số nguyên từ file vào biến n

// xuất n ra màn hình

cout<<"n="<

// cấp phát bộ nhớ cho mảng n số

a=gấp đôi mới[n];

//đọc n số thực từ file vào mảng a

// xuất mảng ra màn hình

với (i=0; tôi

cout<

cout<

// đóng tài liệu

fclose(f);

hệ thống ("tạm dừng");

trả về 0;

Tập tin nhị phân- Cấu trúc dữ liệu tuần tự, sau khi mở một file thì byte đầu tiên lưu trong đó sẽ có sẵn. Bạn có thể ghi hoặc đọc dữ liệu từ một tập tin một cách tuần tự. Giả sử bạn cần đếm số thứ mười lăm, sau đó là số đầu tiên. Sử dụng truy cập tuần tự, điều này có thể được thực hiện theo cách sau:

int n, tôi;

gấp đôi;

TẬP TIN *f;

f=fopen("D:\\game\\noobs.dat", "rb");

với (i=0; tôi<15; i++)

fclose(f);

f=fopen("D:\\game\\noobs.dat", "rb");

fread(&a, sizeof(double), 1, f);

fclose(f);

Như bạn có thể thấy, việc đọc số từ một tệp rồi mở lại tệp đó không phải là cách thuận tiện nhất. Sẽ thuận tiện hơn nhiều khi sử dụng hàm fseek để di chuyển con trỏ tệp đến một byte nhất định.

int fseek(FILE *tên tệp, int offset dài, int Origin);

Hàm đặt con trỏ vị trí tệp hiện tại F theo giá trị gốc và giá trị offset. Tham số offset bằng số byte mà con trỏ tệp sẽ được offset so với điểm gốc được chỉ định bởi tham số gốc. Giá trị cho tham số Origin phải là một trong các giá trị offset sau được xác định trong tiêu đề stdio.h:

SEEK_SET - từ đầu tệp;

SEEK_CUR - từ vị trí hiện tại;

SEEK_END - từ cuối tệp.

Hàm trả về giá trị 0 nếu thao tác thành công, giá trị khác 0 nếu offset không thành công.

Hàm fseek thực sự triển khai quyền truy cập trực tiếp vào bất kỳ giá trị nào trong tệp. Bạn chỉ cần biết vị trí (số byte) của giá trị trong tệp. Hãy xem xét việc sử dụng quyền truy cập trực tiếp vào các tệp nhị phân bằng cách sử dụng vấn đề sau làm ví dụ.

VÍ DỤ

Trong tệp nhị phân D:\\game\\noobs.dat được tạo trước đó, hoán đổi số thực lớn nhất và nhỏ nhất.

Thuật toán giải bài toán bao gồm các giai đoạn sau:

    đọc số thực từ một tập tin vào mảng a.

    tìm kiếm trong mảng a các giá trị tối đa (tối đa) và tối thiểu (tối thiểu) cũng như số của chúng (imax, imin).

    di chuyển con trỏ tệp đến giá trị tối đa và ghi giá trị tối thiểu.

    di chuyển con trỏ tệp đến giá trị tối thiểu và ghi tối đa.

Dưới đây là nội dung của chương trình giải quyết vấn đề bằng nhận xét.

#include "stdafx.h"

#bao gồm

sử dụng không gian tên std;

int chính()

setlocale(LC_ALL, "RUS");

int n, i, imax, imin;

gấp đôi *a, tối đa, tối thiểu;

TẬP TIN *f;

//mở file ở chế độ đọc-ghi

f=fopen("D:\\game\\noobs.dat", "rb+");

//đọc số từ file vào biến n

// số thực trong tệp

fread(&n, sizeof(int), 1, f);

cout<<"n="<

// cấp phát bộ nhớ để lưu trữ số thực,

// sẽ được lưu trữ trong mảng a

a=gấp đôi mới[n];

//đọc từ file vào mảng và số thực

fread(a, sizeof(double), n, f);

//tìm kiếm phần tử lớn nhất và nhỏ nhất

// trong mảng a và các chỉ số của chúng

vì (imax=imin=0, max=min=a, i=1; i

nếu (a[i]>tối đa)

max=a[i];

nếu (a[i]

phút=a[i];

// di chuyển con trỏ ĐẾN tối đa yếu tố

fseek(f, sizeof(int)+imax*sizeof(double), SEEK_SET);

// ghi phần tử tối thiểu thay vì phần tử tệp tối đa

fwrite(&min, sizeof(double), 1, f);

// di chuyển con trỏ ĐẾN tối thiểu yếu tố

fseek(f, sizeof(int)+imin*sizeof(double), SEEK_SET);

// ghi giá trị tối đa thay vì phần tử tệp tối thiểu

fwrite(&max, sizeof(double), 1, f);

//đóng tập tin

fclose(f);

// giải phóng bộ nhớ

xóa bỏ [ ]Một;

hệ thống ("tạm dừng");

– 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(“\n Thứ 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 con trỏ tệp 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.

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.