C 语言文件操作
在 C 语言中,文件操作是通过标准库中的文件输入输出函数来实现的。最常用的文件操作函数包括读取和写入文件的函数。常见的文件操作函数有:
1. 打开文件:fopen()
fopen() 函数用于打开一个文件,返回一个文件指针(FILE*),该指针可以用于后续的文件操作。
FILE *fopen(const char *filename, const char *mode);
filename:文件的路径或文件名。mode:打开文件的模式,常见的模式包括:"r":只读模式,文件必须存在。"w":写入模式,文件不存在时会创建新文件,若文件存在,则清空文件。"a":追加模式,数据会被写入到文件的末尾。"rb","wb":以二进制模式读取或写入文件。"r+":读写模式,文件必须存在。"w+":读写模式,文件不存在时创建文件,文件存在时清空文件。"a+":追加读写模式。
2. 读取文件
2.1 fgetc()
fgetc() 函数从文件中读取下一个字符并返回,读取到文件末尾时返回 EOF。
int fgetc(FILE *stream);
stream:文件指针。- 返回值:成功时返回读取的字符,失败时返回
EOF。
示例:
#include <stdio.h>
int main() {
FILE *file = fopen("example.txt", "r");
if (file == NULL) {
printf("Error opening file\n");
return 1;
}
char c;
while ((c = fgetc(file)) != EOF) {
putchar(c);
}
fclose(file);
return 0;
}
2.2 fgets()
fgets() 函数从文件中读取一行字符,直到遇到换行符 \n 或文件末尾 EOF,或者达到指定的字符数。
char *fgets(char *str, int num, FILE *stream);
str:存储读取结果的字符数组。num:要读取的最大字符数(包括\0字符)。stream:文件指针。
示例:
#include <stdio.h>
int main() {
FILE *file = fopen("example.txt", "r");
if (file == NULL) {
printf("Error opening file\n");
return 1;
}
char buffer[100];
while (fgets(buffer, 100, file) != NULL) {
printf("%s", buffer);
}
fclose(file);
return 0;
}
2.3 fread()
fread() 函数从文件中读取指定大小的字节数据,通常用于读取二进制文件。
size_t fread(void *ptr, size_t size, size_t count, FILE *stream);
ptr:存储读取数据的内存位置。size:每个数据项的大小(字节数)。count:要读取的数据项数量。stream:文件指针。
示例:
#include <stdio.h>
int main() {
FILE *file = fopen("example.bin", "rb");
if (file == NULL) {
printf("Error opening file\n");
return 1;
}
char buffer[128];
size_t bytesRead = fread(buffer, sizeof(char), 128, file);
printf("Read %zu bytes\n", bytesRead);
fclose(file);
return 0;
}
3. 写入文件
3.1 fputc()
fputc() 函数将一个字符写入到文件。
int fputc(int c, FILE *stream);
c:要写入的字符(以int类型传递)。stream:文件指针。
示例:
#include <stdio.h>
int main() {
FILE *file = fopen("example.txt", "w");
if (file == NULL) {
printf("Error opening file\n");
return 1;
}
fputc('A', file); // 写入字符 'A'
fclose(file);
return 0;
}
3.2 fputs()
fputs() 函数将字符串写入文件。
int fputs(const char *str, FILE *stream);
str:要写入的字符串。stream:文件指针。
示例:
#include <stdio.h>
int main() {
FILE *file = fopen("example.txt", "w");
if (file == NULL) {
printf("Error opening file\n");
return 1;
}
fputs("Hello, world!\n", file); // 写入字符串
fclose(file);
return 0;
}
3.3 fwrite()
fwrite() 函数将数据写入文件,通常用于写入二进制数据。
size_t fwrite(const void *ptr, size_t size, size_t count, FILE *stream);
ptr:指向要写入的数据的内存位置。size:每个数据项的大小(字节数)。count:要写入的数据项数量。stream:文件指针。
示例:
#include <stdio.h>
int main() {
FILE *file = fopen("example.bin", "wb");
if (file == NULL) {
printf("Error opening file\n");
return 1;
}
char data[] = "This is some binary data";
fwrite(data, sizeof(char), sizeof(data) - 1, file);
fclose(file);
return 0;
}
4. 关闭文件:fclose()
当文件操作完成后,需要关闭文件,这样可以确保所有的文件操作都已经完成,并且释放文件资源。
int fclose(FILE *stream);
stream:要关闭的文件指针。
示例:
#include <stdio.h>
int main() {
FILE *file = fopen("example.txt", "r");
if (file == NULL) {
printf("Error opening file\n");
return 1;
}
// 进行文件操作...
fclose(file); // 关闭文件
return 0;
}
5. 错误处理
文件操作函数通常会返回一个值来指示是否成功。对于大多数函数,若操作失败,它们会返回以下值:
fgetc()、fputc()、fgets()等函数在发生错误时返回EOF。fread()和fwrite()返回实际读取或写入的字节数。
可以使用 ferror() 检查文件操作是否发生错误。
int ferror(FILE *stream);
如果发生错误,ferror() 会返回非零值。
总结
- 读取文件:
fgetc(),fgets(),fread()。 - 写入文件:
fputc(),fputs(),fwrite()。 - 文件关闭:
fclose()。 - 错误处理:通过
ferror()来检查文件操作中的错误。
这些文件操作函数为 C 语言程序提供了处理文本文件和二进制文件的基本能力,灵活使用可以有效处理不同类型的文件读取和写入需求。
