【C语言】文本操作函数fgetc、fputc、fgets、fputs、fprintf、fscanf、fread、fwrite
一、介绍
二、简要概括
三、函数的使用
1、fgetc和fputc
int fgetc ( FILE * stream );
从文件中读取信息,每次读取一个字符
- 从流中获取字符
- 返回指定流的内部文件位置指示符当前指向的字符。然后将内部文件位置指示符推进到下一个字符
int main()
{//打开文件FILE * pf = fopen("data.txt", "r");if (pf == NULL){perror("fopen");return 1;}//读文件int ch = fgetc(pf);printf("%c", ch);//关闭文件fclose(pf);pf = NULL;return 0;
}
int fputc ( int character, FILE * stream );
从建盘中输入信息到文件中,每次输入一个字符
- 将字符写入流
- 将一个字符写入流并推进位置指示器
- 字符被写入流的内部位置指示器所指示的位置,然后自动向前移动一个
int main()
{//打开文件FILE* pf = fopen("data.txt", "w");if (pf == NULL){perror("fopen");return 1;}//写文件fputc("a", pf);//关闭文件fclose(pf);pf = NULL;return 0;
}
2、fgets和fputs
char * fgets ( char * str, int num, FILE * stream );
从文件中读取信息,每次读取一个字符串
- 从流中获取字符串
- 从流中读取字符,并将其作为C字符串存储到 str 中,直到读取 (num-1) 个字符,或者到达换行符或文件结束符
- 换行符使 fgets 停止读取,但它被函数认为是一个有效字符,并包含在复制到 str 的字符串中。
- 在复制到 str 的字符之后,将自动追加一个终止 null 字符。
- 请注意,fgets 与 gets 有很大的不同:fgets 不仅接受流参数,而且允许指定 str 的最大长度,并在字符串中包含任何结束换行符
int main()
{//打开文件FILE * pf = fopen("data.txt", "r");if (pf == NULL){perror("fopen");return 1;}//读文件char arr[100] = { 0 };fgets(arr,5, pf);printf("%s", arr);//关闭文件fclose(pf);pf = NULL;return 0;
}
int fputs ( const char * str, FILE * stream );
从建盘中输入信息到文件中,每次输入一个字符串
- 将字符串写入流
- 将由 str 指向的C字符串写入流
- 函数从指定的地址 (str) 开始复制,直到到达结束的空字符 ('\0'),这个终止的空字符不会复制到流中
int main()
{//打开文件FILE* pf = fopen("data.txt", "w");if (pf == NULL){perror("fopen");return 1;}//写文件fputs("abcde\n", pf);char arr[10] = "efghi";fputs(arr, pf);//关闭文件fclose(pf);pf = NULL;return 0;
}
3、fprintf和fscanf
int fprintf ( FILE * stream, const char * format, ... );
将有格式的数据转换为字符串并且写入文件
- 将格式化的数据写入流
- 将由 format 指向的 C字符串写入流。如果 format 包含格式说明符(以%开头的子序列),则格式化format 之后的其他参数并将其插入到结果字符串中,以替换它们各自的说明符。
struct S
{char name[10];int age;float score;
};int main()
{struct S s = { "zhangsan",18,94.5};FILE* pf = fopen("data.txt", "w");//打开文件if (pf == NULL){perror("fopen");return 1;}//读文件fprintf(pf, "%s %d %f", s.name, &(s.age), &(s.score));//关闭文件fclose(pf);pf = NULL;return 0;
}
int fscanf ( FILE * stream, const char * format, ... );
将文件中的字符串转换为有格式的数据并且读取出来
- 从流中读取格式化的数据
- 从流中读取数据,并根据参数格式将其存储到附加参数所指向的位置
- 额外的参数应该指向已经分配的对象,其类型由格式字符串中相应的格式说明符指定
struct S
{char name[10];int age;float score;
};int main()
{struct S s = { 0 };FILE* pf = fopen("data.txt", "r");//打开文件if (pf == NULL){perror("fopen");return 1;}//读文件fscanf(pf, "%s %d %f", s.name, &(s.age), &(s.score));printf("%s %d %f", s.name, s.age, s.score);//关闭文件fclose(pf);pf = NULL;return 0;
}
4、fread和fwrite
size_t fread ( void * ptr, size_t size, size_t count, FILE * stream );
将文件中的内容转换为二进制然后读取出来
- 从流中读取数据块
- 从流中读取一个由 count 元素组成的数组,每个元素的大小为 size 字节,并将它们存储在 ptr 指定的内存块中
- 流的位置指示器按读取的总字节数前进
- 如果成功读取的总字节数为 (size*count)
- 以二进制的方式读取文件
//二进制的方式读取文件
int main()
{int arr[10] = {0};//写文件FILE* pf = fopen("data.txt", "rb");if (pf == NULL){perror("fopen");return 1;}//二进制的读文件fread(arr, sizeof(arr[0]), sizeof(arr) / sizeof(arr[0]), pf);int i = 0;for (i = 0; i < 10; i++){printf("%d ", arr[i]);}//关闭文件fclose(pf);pf = NULL;return 0;
}
size_t fwrite ( const void * ptr, size_t size, size_t count, FILE * stream );
将数据转换为二进制然后写入文件
- 将数据块写入流
- 将由 count 元素组成的数组 (每个元素的大小为 size 字节) 从 ptr 所指向的内存块写入流中的当前位置
- 流的位置指示器按写入的总字节数前进
- 在内部,该函数将 ptr 指向的块解释为 unsigned char 类型的 (size*count) 元素数组,并将它们顺序写入流,就像对每个字节调用 fputc 一样
//二进制的方式写进文件
int main()
{int arr[] = { 1,2,3,4,5,6,7,8,9,10 };//写文件FILE*pf = fopen("data.txt", "wb");if (pf == NULL){perror("fopen");return 1;}//二进制的写文件fwrite(arr, sizeof(arr[0]), sizeof(arr)/sizeof(arr[0]), pf);//关闭文件fclose(pf);pf = NULL;return 0;
}