C中文件可分为文本文件和二进制文件。
在C语言中,FILE 类型是一个用于表示文件流的结构体类型。这个结构体在标准I/O(输入/输出)库中定义,尽管其确切的内部结构对程序员是隐藏的,也可能因不同的编译器实现而有所不同。FILE 结构体包含了所有用于文件操作的必要信息,例如文件的位置指针、错误指示器、文件结束指示器等。
使用 FILE 类型创建文件指针,用于后续的文件操作。
FILE *fp;
使用 fopen 函数打开文件时,会返回一个 FILE 类型的指针。
fp = fopen("example.txt", "r"); // 打开文件用于读取
if (fp == NULL) {
// 错误处理
}
通过 FILE 类型的指针,可以使用各种文件操作函数,如 fprintf、fscanf、fgets、fputs、fread 和 fwrite 等。
fprintf(fp, "Hello, World!"); // 写入文件
char buffer[100];
fgets(buffer, 100, fp); // 从文件读取
fprintf 函数用于向文件写入格式化的输出,类似于 printf,但输出到指定的文件流。
FILE *fp = fopen("file.txt", "w");
fprintf(fp, "The value of pi: %f\n", 3.1416);
fclose(fp);
fscanf 函数用于从文件读取格式化的输入,类似于 scanf,但从指定的文件流读取。
FILE *fp = fopen("file.txt", "r");
int age;
fscanf(fp, "%d", &age);
fclose(fp);
fgets 函数用于从文件中读取一行,它会读取直到换行符或文件结束,或者读取到指定的字符数为止。
char buffer[100];
FILE *fp = fopen("file.txt", "r");
if (fgets(buffer, 100, fp) != NULL) {
printf("%s", buffer);
}
fclose(fp);
fputs 函数用于向文件写入一个字符串,但不包括空字符(‘\0’)
fread 函数用于从文件读取数据块。它适用于二进制文件或需要读取固定大小数据块的场合。
FILE *fp = fopen("data.bin", "rb");
char data[100];
size_t bytesRead = fread(data, sizeof(char), 100, fp);
fclose(fp);
fwrite 函数用于向文件写入数据块。它同样适用于二进制文件或需要写入固定大小数据块的场合。
FILE *fp = fopen("data.bin", "wb");
char data[100] = "Some data";
fwrite(data, sizeof(char), strlen(data), fp);
fclose(fp);
FILE *fp = fopen("file.txt", "w");
fputs("Hello, World!", fp);
fclose(fp);
文件操作完成后,使用 fclose 关闭文件,释放资源。
fclose(fp);
使用 fseek、ftell 和 rewind 等函数移动文件指针或获取当前位置。
fseek(fp, 0, SEEK_END); // 移动到文件末尾
long fileSize = ftell(fp); // 获取文件大小
rewind(fp); // 回到文件开头
下面是一个简单的示例,展示了如何在C语言中创建一个文件,向其中写入一些文本,然后读取并显示这些文本:
#include
int main() {
FILE *fp;
// 打开文件用于写入
fp = fopen("test.txt", "w");
if (fp == NULL) {
perror("Error opening file");
return -1;
}
fprintf(fp, "Hello, file!\n");
fclose(fp); // 关闭文件
// 打开文件用于读取
fp = fopen("test.txt", "r");
if (fp == NULL) {
perror("Error opening file");
return -1;
}
char buffer[100];
fgets(buffer, 100, fp);
printf("Read from file: %s", buffer);
fclose(fp); // 关闭文件
return 0;
}
注意:上述代码在VS2015中报错的话,改成fp = fopen_s(&fp,“test.txt”, “r”);即可