文章目录
1. 文件分类
我们通常见到文件可分为程序文件和数据文件,程序文件例如 test.c,detect.py等都是程序文件,数据文件顾名思义,就是存储数据的文件,例如我们通常使用的的记事本。
数据文件按照存储方式可以分为文本文件和二进制文件,文本文件以ASCII码存储字符,二进制文件是以二进制01形式存储文件的。
针对文本文件和二进制文件,C语言有着不同的处理方式。
2. 文件处理模式,常用函数
2.1 文件处理模式
文件通常处理模式分为 : r , w ,a ,r+,w+,a+ 。
r表示以读的模式打开文件,如果文件不存在,则报错。
w表示以写的模式打开文件,如果文件不存在,则创建该文件。
a表示以追加模式打开文件,向文件末尾追加数据,如果该文件不存在,则创建文件。
r+表示以读写模式打开文件,如果文件不存在,则报错。
w+表示以写读模式打开文件,如果文件不存在,则创建该文件。
a+表示以追加和读的模式打开文件,读从文件起始位置开始,追加以文件末尾开始,如果文件不存在,则创建该文件。
rb , wb ,ab ,rb+,wb+,ab+ 表示处理二进制文件,功能与上述对应的模式相似。
2.2 文件处理常用函数
fgetc 表示从输入中读取一个字符,fputc表示写入一个字符。
fgetc 表示从输入中读取指定长度的字符串,fputc表示写入一个字符串。
fscanf表示格式化读取内容,fprintf表示格式化写入内容。
fwrite表示写入二进制内容,fread表示读取二进制内容。
3. 应用举例
3.1 向文件中写入0到9数字
fgetc_fputc测试
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main() {
FILE* p1 = fopen("data.txt", "w+");
if (p1 == NULL) {
perror("fopen data.txt error:");
return 1;
}
int i = 0;
for (i = 0; i < 10; i++) {
fputc('0' + i, p1);
}
rewind(p1); //使光标回到开始位置
int ch;
for (i = 0; i < 10; i++) {
ch = fgetc(p1);
printf("%c ", ch);
}
fclose(p1);
return 0;
}
3.2 将一个文件内容复制到另一个文件中
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main() {
FILE* p1 = fopen("data.txt", "r");
FILE* p2 = fopen("data_copy.txt", "w");
if (p1 == NULL ||p2==NULL) {
perror("fopen error:");
return 1;
}
int ch = 0;
while ((ch = fgetc(p1)) != EOF) {
fputc(ch, p2);
}
fclose(p1);
fclose(p2);
return 0;
}
3.3 fread_fwrite函数测试
void test_fread_fwrite(void) {
FILE* p1 = NULL;
p1 = fopen("test3.txt", "wb+");
if (p1 == NULL) {
perror("fopen error test3.txt :");
exit(1);
}
int arr[10] = { 0,1,2,3,4,5,6,7,8,9 };
int arr1[10] = { 0 };
fwrite(arr, sizeof(int), 10, p1);
rewind(p1);
fread(arr1, sizeof(int),10, p1);
for (int i = 0; i < 10; i++) {
printf("%d ", arr1[i]);
}
fclose(p1);
p1 = NULL;
}
3.4 sprintf_sscanf函数测试
struct stu {
int age;
char name[10];
float money;
};
void test_sprintf_sscanf(void) {
char* p1 = (char*)malloc(20);
char* p2 = (char*)malloc(20);
struct stu s1 = { 55,"wangwu",5000. };
int a = 0;
char arr[10] = { 0 };
float b = 0.;
//sprintf(p1, "%d %s %f", 50, "daydayup", 3.500000);
//printf(p1);
sprintf(p1, "%d %s %f", s1.age, s1.name, s1.money);
//printf(p1);
sscanf(p1, "%d %s %f", &a, arr, &b);
printf(" %d %s %f", a, arr, b);
}
3.5 fgets_fputs函数测试
void test_fgets_fputs(void) {
FILE* p1 = NULL;
p1 = fopen("test.md", "w+");
if (p1 == NULL) {
perror("fopen fail:");
return 1;
}
fputs("woaixuexi", p1);
char arr[20] = { 0 };
rewind(p1); //写完之后在最后的位置,要读取的话得重置光标的位置
fgets(arr, 20, p1);
printf(arr);
fclose(p1);
p1 = NULL;
}
3.6 fseek_ftell_rewind函数测试
void test_fseek_ftell_rewind(void) {
FILE* p1 = NULL;
char p2[50] = { 0 };
p1 = fopen("test4.txt", "w+");
if (p1 == NULL) {
perror("fopen error: ");
exit(1);
}
fputs("hello world", p1);
int num_offset = ftell(p1);
printf("%d ", num_offset);
fseek(p1, 1, SEEK_SET);
fputs("xxxxx", p1);
num_offset = ftell(p1);
printf("%d\n", num_offset);
rewind(p1);
fgets(p2, 50, p1);
printf(p2);
fclose(p1);
p1 = NULL;
}
总结
本文主要阐述了文件的各种处理模式以及常见的文件处理函数,并且用C语言举例这些函数的该怎么使用,验证了这些函数的功能。