Các thao tác cơ bản với file trong C
▪ Khai báo và sử dụng FILE : Kiểu FILE *
▪ Cú pháp : FILE *ten_con_tro_file;
Ví dụ: FILE *f, *g; /* Khai báo hai biến con trỏ tệp */
▪ Để làm việc với file, chúng ta cần biết vị trí của file (thông qua đường dẫn) để con trỏ kiểu FILE
có thể tạo được luồng dữ liệu giữa người dùng và file trên thiết bị lưu trữ.
Ví dụ: một file văn bản (*.txt) hoặc dạng (*.INP) được lưu trữ như sau C:/Desktop/my_document.txt
Trong C khai báo con trỏ đến chuỗi ký tự lưu trữ đường dẫn và tên file
const char *filePath = "C:/Desktop/my_document.txt"; // con trỏ đén hằng số kiểu chuỗi
#include
#include
using namespace std;
int main()
{
const char *filePath = "C:/Desktop/my_document.txt";
FILE *file;
return 0;
}FILE
▪ Open file (Mở FILE): Để mở một file, các bạn có thể sử dụng hàm fopen
▪ Cú pháp:
▪ Hàm dùng để mở file. Nếu thành công hàm cho con trỏ ki
42 trang |
Chia sẻ: thanhle95 | Lượt xem: 811 | Lượt tải: 1
Bạn đang xem trước 20 trang tài liệu Bài giảng Kỹ thuật lập trình - Chương 4: Tập tin (FILE) - Trịnh Tấn Đạt, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
Tập tin
(FILE)
Trịnh Tấn Đạt
Khoa CNTT - Đại Học Sài Gòn
Email: trinhtandat@sgu.edu.vn
Website: https://sites.google.com/site/ttdat88/
Nội dung
▪ Khái niệm về FILE
▪ Các thao tác cơ bản với file trong C
o Mở/Đóng FILE
o Đọc/Ghi FILE
o Con trỏ FILE
o Binary FILE (option)
o FILE và mảng
▪ Bài Tập
▪ Các thao tác cơ bản với file trong C ++ (tự tìm hiểu thêm - option)
FILE
▪ Theo định nghĩa trên Wikipedia về computer file: Một file trên máy tính là một tài nguyên dùng để
lưu trữ thông tin lâu dài, sử dụng cho các chương trình máy tính.
▪ Trong ngôn ngữ lập trình C/C++: File là kiểu đối tượng chứa các thông tin cần thiết để điều khiển,
bao gồm một con trỏ trỏ đến buffer của nó, các chỉ mục và trạng thái của nó.
▪ File là một kiểu dữ liệu có cấu trúc.
▪ Một file dù được xây dựng bằng cách nào đi nữa cũng chỉ đơn giản là một dãy các byte ghi trên
đĩa. Số byte của dãy chính là độ dài của file.
▪ Có hai kiểu nhập xuất dữ liệu lên file: nhị phân và văn bản.
▪ Làm việc với File chúng ta chỉ có các thao tác cơ bản như: tạo file mới, đọc dữ liệu trong file, ghi
dữ liệu vào file, xóa file...
▪ Trong lập trình C, dùng thư viện để thao tác trên FILE
Các thao tác cơ bản với file trong C
▪ Khai báo và sử dụng FILE : Kiểu FILE *
▪ Cú pháp : FILE *ten_con_tro_file;
Ví dụ: FILE *f, *g; /* Khai báo hai biến con trỏ tệp */
▪ Để làm việc với file, chúng ta cần biết vị trí của file (thông qua đường dẫn) để con trỏ kiểu FILE
có thể tạo được luồng dữ liệu giữa người dùng và file trên thiết bị lưu trữ.
Ví dụ: một file văn bản (*.txt) hoặc dạng (*.INP) được lưu trữ như sau C:/Desktop/my_document.txt
Trong C khai báo con trỏ đến chuỗi ký tự lưu trữ đường dẫn và tên file
const char *filePath = "C:/Desktop/my_document.txt"; // con trỏ đén hằng số kiểu chuỗi
#include
#include
using namespace std;
int main()
{
const char *filePath = "C:/Desktop/my_document.txt";
FILE *file;
return 0;
}
FILE
▪ Open file (Mở FILE): Để mở một file, các bạn có thể sử dụng hàm fopen
▪ Cú pháp:
▪ Hàm dùng để mở file. Nếu thành công hàm cho con trỏ kiểu FILE ứng với file vừa
mở. Các hàm liên quan khác sẽ làm việc với file thông qua con trỏ này. Nếu có lỗi
hàm sẽ trả về giá trị NULL.
FILE* fopen(const char *file, const char *mode);
Trong đó :
• file: tên tập tin cần mở. Có thể chỉ định một đường dẫn đầy đủ chỉ đến vị trí của tập tin.
• mode: chế độ mở tập tin: chỉ đọc, để ghi (tạo mới), ghi thêm.
FILE
▪ Tập tin văn bản : là kiểu tập tin được lưu trữ các thông tin dưới dạng kiểu ký tự.
▪ Truy xuất tập tin văn bản:
o theo từng ký tự
o theo từng dòng
▪ Để mở file dạng văn bản dùng mode “t”
Mở FILE
▪ Mode: open file
Mở FILE
▪ Ví dụ
const char *filePath = "C:/Desktop/my_document.txt";
FILE *file;
file = fopen(filePath, "rt"); // doc file van ban
if (!file) // (file == NULL)
cout << "Can not open this file" << endl;
else
cout << "File is opened" << endl;
Đóng FILE
▪ Đóng file (close FILE): Sau khi thao tác với file xong, các bạn cần đóng file lại để tránh những lỗi
phát sinh ngoài ý muốn. Để đóng file, chúng ta sử dụng hàm fclose:
▪ Cú pháp :
file: là con trỏ được dùng để lưu trữ địa chỉ của đối tượng FILE đang mở. Nếu đóng file thành
công thì trả về giá trị 0, ngược lại trả về EOF (End of file)
▪ Hàm fclose sẽ giải phóng tất cả dữ liệu chưa được xử lý trên file nếu chúng vẫn còn lưu trong
buffer, đóng file lại, và giải phóng tất cả vùng nhớ mà đối tượng FILE sử dụng.
int fclose(FILE *file);
const char *filePath = "C:/Desktop/my_document.txt";
FILE *file;
file = fopen(filePath, "rt");
if (!file) // file == NULL
cout << "Can not open this file" << endl;
else
cout << "File is opened" << endl;
fclose(file);
FILE
▪ Làm sạch vùng đệm - hàm fflush
▪ Cú pháp:
▪ int fflush(FILE *fp);
▪ Dùng làm sạch vùng đệm của tệp fp. Nếu lệnh thành công, hàm sẽ cho giá trị 0, trái lại nó cho hàm
EOF.
▪ Ví dụ: fflush(fp); // fp là con trỏ FILE
Ghi FILE
▪ Ghi dữ liệu vào FILE.
▪ Để mở file cho chế độ ghi file, chúng ta có các mode "w", "w+", "a", "a+".
Ví dụ: Giả sử đọc file và dùng con trỏ fie để quản lý
const char *filePath = "C:/Desktop/my_document.txt";
FILE *file;
file = fopen(filePath, "wt"); // che do ghi
if (!file) // file == NULL
cout << "Can not open this file" << endl;
else
cout << "File is opened" << endl;
// ghi dữ liệu lên file // code here
fclose(file);
Ghi FILE
▪ Các hàm cơ bản để ghi FILE
▪ Hàm fputc:
▪ Hàm fputc sẽ ghi ký tự có mã ASCII là biến c vào file được trỏ đến bởi con trỏ f.
▪ Giá trị trả về là EOF nếu ghi dữ liệu thất bại, trả về mã ASCII của kí tự được ghi vào nếu thực hiện
thành công.
Ví dụ: FILE *file = fopen(filePath, "wt"); // dùng con trỏ file
int fputc(int c, FILE *f);
int c = fputc('A', file); // ghi ký tự A vào file my_document.txt
cout << c << endl;
Ghi FILE
▪ Các hàm cơ bản để ghi FILE
▪ Hàm fputs:
▪ Hàm fputs ghi một C-Style string vào file được trỏ đến bởi con trỏ f cho đến khi gặp kí tự '\0'
Ví dụ:
FILE *file = fopen(filePath, "wt"); // dùng con trỏ file
fputs("Hello World", file); // ghi chuỗi Hello World vào file my_document.txt
int fputs(const char *str, FILE *f);
Ghi FILE
▪ Các hàm cơ bản để ghi FILE
▪ Hàm fprintf :
▪ Hàm fprintf tương tự hàm printf trong ngôn ngữ C nhưng được dùng để ghi dữ liệu lên file
Ví dụ:
FILE *file = fopen(filePath, "wt"); // dùng con trỏ file
int fprintf(FILE *f, const char *format, ...);
for (int i = 1; i <= 5; i++)
fprintf(file, "This is an example line %d\n", i);
Ghi FILE
▪ Ví dụ ghi FILE dùng hàm void writeToFile(FILE *file)
const char *filePath = "C:/Desktop/my_document.txt";
FILE *file;
file = fopen(filePath, "wt");
if (!file) // file == NULL
cout << "Can not open this file" << endl;
else
cout << "File is opened" << endl;
writeToFile(file); // dinh nghia ham ghi FILE
fclose(file);
void writeToFile(FILE *file)
{
for (int i = 1; i <= 5; i++)
fprintf(file, "This is an example line %d\n", i);
}
Đọc FILE
▪ Đọc dữ liệu từ FILE
▪ Để đọc dữ liệu từ file, yêu cầu file đó đã tồn tại và được lưu trữ sẵn. Ngược lại sẽ xuất hiện lỗi (file
chưa tồn tại)
▪ Để mở file cho chế độ đọc file, chúng ta có các mode "r", "r+", "a", "a+".
const char *filePath = "C:/Desktop/my_document.txt"; // file này đã tồn tại
FILE *file;
file = fopen(filePath, "rt"); // che do doc file
if (!file) // file == NULL
cout << "Can not open this file" << endl;
else
cout << "File is opened" << endl;
// đọc dữ liệu từ file // code here
fclose(file);
Đọc FILE
▪ Các hàm cơ bản để đọc FILE
▪ Hàm fgetc:
▪ Hàm fgetc đọc ra một kí tự trong file, internal file position indicator sẽ chuyển đến kí tự tiếp theo.
Giá trị trả về là mã ASCII của kí tự đã đọc được.
Ví dụ: FILE *file = fopen(filePath, "rt"); // dùng con trỏ file
int fgetc(FILE *f);
cout << (char)fgetc(file) << endl;
Đọc FILE
▪ Các hàm cơ bản để đọc FILE
▪ Hàm fgets :
▪ Hàm fgets đọc từ file ra (n - 1) kí tự, việc đọc dữ liệu sẽ bị dừng nếu đọc được kí tự new line '\n'
hoặc EOF.
▪ Chuỗi kí tự đọc được sẽ lưu vào vùng nhớ được quản lý bởi con trỏ buf, nếu đọc dữ liệu thành
công thì trả về địa chỉ của buf, ngược lại trả về NULL.
Ví dụ: FILE *file = fopen(filePath, "rt"); // dùng con trỏ file
char* fgets(char *buf, int n, FILE *f);
char buff[255]; // buffer lưu trữ dữ liệu đọc được
cout << fgets(buff, 255, file) << endl;
cout << buff << endl;
Đọc FILE
▪ Các hàm cơ bản để đọc FILE
▪ Hàm fscanf :
▪ fscanf cũng hoạt động tương tự hàm scanf trong ngôn ngữ C nhưng được dùng để đọc dữ liệu từ
file
Ví dụ: FILE *file = fopen(filePath, "rt"); // dùng con trỏ file
int fscanf(FILE *f, const char *format, ...);
char buff[255];
fscanf(file, "%s", buff);
cout << buff << endl;
- Chuỗi ký tự. Nó sẽ đọc các ký tự liên tiếp nhau tới khi tìm thấy
một whitespace (có thể là blank, newline (dòng mới) và tab)
// Xét ví dụ về số
int n;
fscanf(file, "%d",&n);
std::cout << n<< std::endl;
Đọc FILE
▪ Ví dụ đọc FILE dùng hàm void readFromFile(FILE *file)
const char *filePath = "C:/Desktop/my_document.txt"; // file đã tồn tại
FILE *file;
file = fopen(filePath, "rt");
if (!file) // file == NULL
std::cout << "Can not open this file" << std::endl;
else
std::cout << "File is opened" << std::endl;
readFromFile(file); // dinh nghia ham doc FILE
fclose(file);
void readFromFile(FILE *file)
{
char str[255];
std::cout << fgets(str, 255, file) << std::endl;
std::cout << str << std::endl;
}
Con Trỏ FILE
▪ Hàm kiểm tra cuối file: feof()
▪ Cú pháp
▪ Hàm dùng để kiểm tra cuối
tệp. Hàm cho giá trị khác 0
nếu gặp cuối tệp khi đọc, trái
lại hàm cho giá trị 0.
int feof(FILE *file)
#include
#include
using namespace std;
int main ()
{
FILE *fp;
int c;
fp = fopen(“text.txt","rt");
if(fp == NULL)
{ cout <<“Khong doc dc file";
return 0;
}
while(1)
{
c = fgetc(fp);
if( feof(fp) )
{
break ;
}
cout << c;
}
fclose(fp);
return0;
}
Giả sử file text.txt chứa nội dung sau
Ky thuat lap trinh hoc ky 2- 2020
Kết quả in chuỗi trong file ra màn hình
Con Trỏ FILE
▪ Hàm rewind: Chuyển con trỏ chỉ vị về đầu file
Cú pháp: void rewind(FILE *f);
Chuyển con trỏ về đầu file . Khi đó việc nhập xuất trên fp được thực hiện từ đầu.
Ví dụ: rewind(f);
▪ Hàm fseek: Chuyển con trỏ chỉ vị trí cần thiết
Cú pháp: int fseek(FILE *f, long int offset, int origin);
Trong đó:
• f là con trỏ trỏ đến đối tượng FILE đang mở.
• offset là số bytes được cộng thêm tính từ vị trí origin.
• origin là địa điểm đặt con trỏ trong file.
Chiều di chuyển là về cuối file nếu offset dương, trái lại nó sẽ di chuyển
về đầu file.
Khi thành công, hàm trả về giá trị 0. Khi có lỗi hàm trả về giá trị khác
không.
Ví dụ:
- Di chuyển con trỏ về đầu file
fseek(f, 0, SEEK_SET);
Tham số origin
•SEEK_SET hay 0 : Xuất phát từ đầu tệp.
•SEEK_CUR hay 1: Xuất phát từ vị trí hiện tại của con trỏ chỉ vị.
•SEEK_END hay 2 : Xuất phát từ cuối tệp.
Con Trỏ FILE
▪ Hàm ftell : cho biết vị trí hiện tại của con trỏ FILE.
▪ Cú pháp : long int ftell(FILE *f);
▪ Hàm cho biết vị trí hiện tại của con trỏ file (byte thứ mấy trên file) khi thành công. Số thứ tự tính từ 0.
Trái lại hàm cho giá trị -1L.
Ví dụ:
fseek(fp,0,SEEK_END);
ftell(fp); // cho giá trị 3.
fseek(fp,-1,SEEK_END);
ftell(fp) // cho giá trị 2.
Đọc/Ghi FILE
▪ Ví dụ: đọc/ghi file văn bản
*Note: Dùng fopen trong Visual Studio C++ bị lỗi
Error C4996 'fopen': This function or variable may be unsafe.
Consider using fopen_s instead. To disable deprecation, use
_CRT_SECURE_NO_WARNINGS
Khắc phục:
- thêm vào đầu file cpp chứa hàm Main đoạn script sau:
#pragma warning(disable:4996)
#pragma warning(disable:4996)
#include
#include
using namespace std;
void writeToFile(FILE *file)
{
for (int i = 1; i <= 5; i++)
fprintf(file, "This is an example line %d\n", i);
}
void readFromFile(FILE *file)
{
char str[255];
while (fgets(str, 255, file) != NULL)
{
cout << str;
}
}
int main()
{
const char *filePath = "F:\\my_document.txt";
FILE *file;
file = fopen(filePath, "w+t");
if (!file) // file == NULL
cout << "Can not open this file" << endl;
else
cout << "File is opened" << endl;
writeToFile(file);
fseek(file, 0, SEEK_SET); // dieu gi xay ra neu khong dung fseek tai day
readFromFile(file);
fclose(file);
return 0;
}
Binary FILE (option)
▪ Tập tin nhị phân là một chuỗi các ký tự, không phân biệt ký tự in được hay không in được.
▪ Tập tin nhị phân thường dùng để lưu trữ các cấu trúc (struct) hoặc union
▪ Khai báo: FILE * fp;
▪ Truy xuất tập tin nhị phân theo khối dữ liệu nhị phân.
▪ Các chế độ mở tập tin nhị phân:
“rb” : mở chỉ đọc
“wb” : ghi (ghi đè lên tập tin cũ hoặc tạo mới nếu tập tin không có trên đĩa)
“ab” : ghi nối vào cuối tập tin.
“rb+” : đọc/ghi. Tập tin phải có trên đĩa.
“wb+” : tạo mới tập tin cho phép đọc ghi.
“ab+” : đọc, ghi vào cuối tập tin. Tạo mới tập tin nếu tập tin chưa có trên đĩa
Binary FILE (option)
▪ Hàm ghi tập tin nhị phân: fwrite ()
▪ Cú pháp : size_t fwrite(const void *ptr, size_t size, size_t count, FILE *f);
▪ Hàm fwrite dùng để ghi dãy bit trong vùng nhớ được quản lý bởi con trỏ ptr vào file đang được trỏ
bởi f, size là số bytes sẽ copy từ vùng nhớ của ptr và count là số lần ghi vùng nhớ đó xuống file.
Ví dụ :
const char *filePath = "C:/Desktop/my_document.txt";
FILE *file;
file = fopen(filePath, "w+b"); //use binary mode
char *s = "Hello everyone!";
fwrite(s, strlen(s), 1, file) // ghi chuỗi s vào file
Binary FILE (option)
▪ Hàm đọc tập tin nhị phân: fread ()
▪ Cú pháp : size_t fread(void *ptr, size_t size, size_t count, FILE *f);
▪ Hàm fread sẽ copy count lần block of bits có kích thước là size, đưa vào vùng nhớ được trỏ đến bởi ptr, từ file
đang được quản lý bởi f.
▪ Sau khi gọi hàm fread,vi trí con trỏ trong file sẽ di chuyển tới (size * count) bytes từ vị trí bắt đầu đọc file.
▪ Nếu có lỗi hoặc EOF thì giá trị trả về nhỏ hơn count.
▪ Hàm fread và fwrite thường được dùng để đọc và ghi dữ liệu kiểu struct vào file.
Ví dụ :
const char *filePath = "C:/Desktop/my_document.txt"; // file đã tồn tại
FILE *file;
file = fopen(filePath, "r+b"); //use binary mode
void *ptr = operator new(255); //allocate 255 bytes on Heap
fread(ptr, 255, 1, file);
(static_cast(ptr))[255] = '\0';
std::cout (ptr) << std::endl;
FILE và Mảng
▪ Đọc và ghi dữ liệu cho mảng (1 và 2 chiều)
▪ Để đơn giản chúng ta chỉ làm việc trên file văn bản (*.txt, *.INP, )
▪ Có 2 dạng:
Dạng 1:
- Dòng đầu tiên chứa thông tin số lượng phần tử của mảng
- Các dòng tiếp theo chứa các phần tử trong mảng
* Lưu ý: mỗi phần tử cách nhau ít nhất một khoảng trắng.
Ví dụ :
File : test1.txt
5
10 20 -40 2 1
File : test2.txt
2 3
10 -20 4
50 -10 20
Mảng 1 chiều chứa 5 phần tử
{10,20.-40,2,1} được lưu trong
file test1.txt
Mảng 2 chiều kích thước
2x3 được lưu trong file
test2.txt
10 -20 4
50 -10 20
FILE và Mảng
Dạng 2: Chỉ chứa các phần tử trong mảng
* Lưu ý: mỗi phần tử cách nhau ít nhất một khoảng trắng.
Ví dụ :
▪ Khi đọc file, xử lý file dạng 1 sẽ đơn giản hơn dạng 2 nhờ vào việc biết trước thông tin số lượng
phần tử trong mảng.
File : test1.txt
10 20 -40 2 1
File : test2.txt
10 -20 4
50 -10 20
Mảng 1 chiều chứa 5 phần tử
{10,20.-40,2,1} được lưu trong
file test1.txt
Mảng 2 chiều kích thước
2x3 được lưu trong file
test2.txt
10 -20 4
50 -10 20
FILE và Mảng
▪ Ví dụ: Đọc ghi FILE cho mảng 1 chiều (dùng dạng 1)
Ví dụ: Mảng một chiều
Tạo File input_1.txt có nội dung như sau
Yêu cầu: viết chương trình đọc dữ liệu từ file và lưu trữ trong mảng A.
Nhân các giá trị trong mảng A với 2 và sau đó ghi kết quả vào file output_1.txt
File : input_1.txt
5
10 2 -35 4 -50
File : output_1.txt
5
20 4 -75 8 -100
#pragma warning(disable:4996)
#include
#include
using namespace std;
void writeToFile(FILE *file, int *Arr, int n)
{
fprintf(file, "%d\n", n);
for (int i = 0; i < n; i++)
fprintf(file, "%d ", Arr[i]);
}
void readFromFile(FILE *file , int *&Arr, int &n)
{
// doc dong dau tien trong file
// luu so luong phan tu n
fscanf(file, "%d", &n);
Arr = new int[n]; // cap phat dong
// doc tung phan tu tu file va luu vao mang
for (int i = 0; i < n; i++)
fscanf(file, "%d", &Arr[i]);
}
int main()
{ // mo file de doc
FILE* fi = fopen("F:\\input_1.txt", "rt");
if (fi == NULL)
{
cout << "khong mo dc file";
return 0;
}
//doc du lieu
int n; int *A;
readFromFile(fi, A, n);
// in mang ra man hinh
for (int i = 0; i < n; i++)
{
cout << A[i] << " ";
A[i] = A[i] *2;
}
FILE *fo = fopen("F:\\output_1.txt", "wt"); // ghi file
writeToFile(fo,A,n);
//dong file
fclose(fi); fclose(fo);
delete[] A;
return 0;
}
FILE và Mảng
▪ Ví dụ: Đọc ghi FILE cho mảng 2 chiều (dùng dạng 1)
▪ Tạo file input_2.txt có dạng sau
File : input_2.txt
2 3
10 -20 4
50 -10 20
Mảng 2 chiều kích thước
2x3 được lưu trong file
input_2.txt
10 -20 4
50 -10 20
Yêu cầu: viết chương trình đọc dữ liệu từ file và lưu trữ trong mảng A.
Nhân các giá trị trong mảng A với 2 và sau đó ghi kết quả vào file
output_2.txt
File : output_2.txt
2 3
20 -40 8
100 -20 40
#pragma warning(disable:4996)
#include
#include
using namespace std;
void writeToFile(FILE *file, int **Arr, int n, int m)
{
fprintf(file, "%d %d\n", n, m);
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
fprintf(file, "%d ", Arr[i][j]);
}
fprintf(file, "\n");
}
}
void readFromFile(FILE *file , int **&Arr, int &n, int &m)
{
fscanf(file, "%d %d", &n, &m);
Arr = new int*[n]; // cap phat dong
for (int i = 0; i < n; i++)
Arr[i] = new int[m];
// doc tung phan tu tu file va luu vao mang
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
fscanf(file, "%d", &Arr[i][j]);
}
int main()
{ FILE* fi = fopen("F:\\input_2.txt", "rt");
if (fi == NULL)
{
cout << "khong mo dc file";
return 0;
}
int n,m; int **A;
readFromFile(fi, A, n, m); //doc du lieu
// in mang ra man hinh
for (int i = 0; i < n; i++)
{ for (int j = 0; j < m; j++)
{
cout << A[i][j] << " ";
A[i][j] = A[i][j] *2;
}
cout <<endl;
}
FILE *fo = fopen("F:\\output_2.txt", "w+t");
writeToFile(fo,A,n,m);
fclose(fi);
fclose(fo);
for (int i = 0; i < n; i++)
delete[] A[i];
delete[] A;
return 0;
}
Câu hỏi
▪ Đọc và ghi FILE về mảng dạng 2 ( không biết trước số lượng phần tử)
▪ Hint: dùng feof() hoặc đọc file đếm số lượng phần tử và di chuyển con trỏ
Câu hỏi 2: Mảng hai chiều
File input.txt có nội dung như sau
1 2 3
4 5 6
a) Đọc một mảng hai chiều từ tập tin input
b) Chuyển vị mảng và ghi kết quả ra file output
File output.txt có nội dung sau
1 4
2 5
3 6
Câu hỏi 1: Mảng 1chiều
File input.txt có nội dung như sau
1 2 3
a) Đọc một mảng 1chiều từ tập tin input
b) Ghi kết quả ra file output theo thứ tự
ngược lại
File output.txt có nội dung sau
3 2 1
#pragma warning(disable:4996)
#include
#include
using namespace std;
void writeToFile(FILE *file, int *Arr, int n)
{
for (int i = 0; i < n; i++)
{
fprintf(file, "%d ", Arr[n-i-1]);
}
}
void readFromFile(FILE *file , int *&Arr, int &n)
{ // C1: dung EoF
// cap phat dong nhung chua biet chinh xac so luong phan
tu
Arr = new int[100];
n = 0;
// doc tung phan tu tu file va luu vao mang
// cho den khi het file EOF
while(!feof(file))
{
fscanf(file, "%d", &Arr[n]);
n++;
}
n--; // cap nhat lai khi eof
}
int main()
{
// mo file de doc
FILE* fi = fopen("F:\\input_3.txt", "rt");
if (fi == NULL)
{
cout << "khong mo dc file";
return 0;
}
//doc du lieu
int n;
int *A;
readFromFile(fi, A, n);
// in mang ra man hinh
for (int i = 0; i < n; i++)
{
cout << A[i] << " ";
}
FILE *fo = fopen("F:\\output_3.txt", "w+t");
writeToFile(fo,A,n);
//dong file
fclose(fi);
fclose(fo);
delete[] A;
return 0;
}
Câu hỏi 1: Cach 1 dung EOF khi chua biet so luong phan tu
void readFromFile(FILE *file , int *&Arr, int &n)
{
int number;
n = 0;
// Dem so luong phan tu co trong file
while (fscanf(file, "%d", &number) > 0)
{
n++;
}
Arr = new int[n]; // cap phat dong chinh xac so luong
// con tro bay gio o cuoi file, do do
// Quay tro lai dau file de doc du lieu vao mang A
fseek(file, 0, SEEK_SET);
// doc tung phan tu tu file va luu vao mang
for (int i = 0; i < n; i++)
fscanf(file, "%d", &Arr[i]);
}
Câu hỏi 1: Cách 2 – Đọc file để đếm số lượng phần tử sau đó lưu vào mảng
Bài tập
1) Cho file input.txt như sau:
127 19 101 11 10 2 5 100 31
a) Đọc file và lưu trữ bằng mảng một chiều sử dụng con trỏ
b) Tính tổng các phần tử của mảng
c) Hai số nguyên dương a và b gọi là nguyên tố cùng nhau nếu ước số chung lớn
nh