C语言是广泛使用的编程语言之一,它提供了丰富的文件操作函数,允许程序能够方便地读写硬盘中的文件。文件操作是进行数据持久化存储的重要手段,因此在C语言开发中文件读写是一个必须掌握的核心知识点。下面将详细探讨C语言中文件读写的不同方式。
C语言在进行文件操作前,必须先打开文件。文件的打开方式决定了文件的操作类型,主要有以下几种:
1. "r":以只读方式打开文件。如果文件不存在,则操作失败,返回NULL。
2. "w":以只写方式打开文件。如果文件不存在,则会创建新文件;如果文件已存在,则会被覆盖。
3. "a":以追加方式打开文件。如果文件存在,写操作会在文件末尾追加数据;如果文件不存在,同样会创建新文件。
4. "r+"、"w+"和"a+":分别对应读写、写读和追加读写。这些模式允许对文件同时读写,但需要在打开时小心处理文件指针的位置。
在文件打开后,可以使用不同的函数来执行文件的读写操作:
-格式化读写函数:fprintf()和fscanf()。fprintf()用于将格式化的数据写入文件,而fscanf()用于从文件中读取格式化的数据。
-数据块读写函数:fread()和fwrite()。它们通常用于二进制文件中,能够一次性读写多个数据。
-单个字符的读写函数:fputc()和fgetc()。fputc()用于向文件写入一个字符,而fgetc()用于从文件读取一个字符。
-字符串读写函数:fputs()和fgets()。fputs()用于向文件写入一个字符串,而fgets()用于从文件读取一行字符串。
文件读写的示例代码如下:
(一) 文件的读
```c
#include "stdio.h"
int main() {
int a, b, c;
FILE *fp;
if ((fp = fopen("data.txt", "r")) == NULL) {
fprintf(stderr, "读取文件失败!\n");
getch();
return 1;
}
fscanf(fp, "%d %d", &a, &b);
c = a - b;
printf("c = %d\n", c);
fclose(fp);
return 0;
}
```
(二) 文件的写
```c
#include "stdio.h"
int main() {
int a, b, c;
FILE *fp;
fp = fopen("data.txt", "w");
if (fp == NULL) {
fprintf(stderr, "写入文件失败!\n");
getch();
return 1;
}
scanf("%d %d", &a, &b);
c = a - b;
fprintf(fp, "c = %d\n", c);
fclose(fp);
return 0;
}
```
(三) 文件读写的综合应用
```c
#include "stdio.h"
#define N 3
#define M 3
struct staff_data {
char name[20];
int num;
int score[M];
};
void save() {
FILE *fp;
int i;
fp = fopen("staff.txt", "wb");
if (fp == NULL) {
printf("打开文件失败\n");
return;
}
for (i = 0; i < N; i++) {
if (fwrite(&staff[i], sizeof(struct staff_data), 1, fp) != 1) {
printf("写入文件错误!\n");
break;
}
}
fclose(fp);
}
int main() {
int i, j;
for (i = 0; i < N; i++) {
scanf("%s %d", staff[i].name, &staff[i].num);
for (j = 0; j < M; j++) {
scanf("%d", &staff[i].score[j]);
}
}
save();
return 0;
}
```
以上代码分别演示了在C语言中如何读取文件、写入文件以及结合使用读写函数进行数据块的存取。在实际开发中,理解文件打开的模式以及恰当选择读写函数对于确保数据正确读取和存储至关重要。需要注意的是,在文件操作完成后,一定要使用fclose()函数关闭文件,以释放系统资源并确保所有数据都被正确写入。同时,在进行文件读写时,应该考虑异常处理机制,例如检查fopen()的返回值,确保文件操作的安全性。