fgetc 函数用于从指定的文件流中读取下一个字符。如果成功,它返回读取到的字符;如果到达文件末尾或发生读取错误,它则返回 EOF
简单示例:
#include
int main() {
FILE *file = fopen("example.txt", "r");
if (file) {
int ch;
while ((ch = fgetc(file)) != EOF) {
putchar(ch); // 将字符输出到标准输出
}
fclose(file);
}
return 0;
}
现在有一个test1.txt文件,我写入abcde,让fgetc读,并打印到屏幕上:
这里就是光标逐次往后移动。
fputc 函数用于向指定的文件流中写入一个字符
int fputc(int char, FILE *stream);
示例
#define _CRT_SECURE_NO_WARNINGS 1
#include
int main()
{
FILE* pf = fopen("test1.txt", "w");
if (pf == NULL)
{
perror("fopen");
return -1;
}
fputc('a', pf);
fputc('b', pf);
fputc('c', pf);
fputc('d', pf);
fclose(pf);
pf = NULL;
return 0;
}
当然也可以用标准输出流打印到屏幕上
现在让我们做一个练习、
将test1.txt中的内容拷贝一份,生成test2.txt文件
从test1.txt中读取数据,写到test2.txt中。
首先,打开两个文件,分别进行读和写:
FILE* pfread = fopen("test1.txt", "r");
if (pfread == NULL)
{
perror("fopen->test1.txt");
return -1;
}
FILE* pfwrite = fopen("test2.txt", "w");
if (pfwrite == NULL)
{
fclose(pfread);
perror("fopen->test2.txt");
return -1;
}
若第二个文件没有打开成功,则需要关闭第一个文件.
接着进行数据的读写
我们用fgetc读取,若读取不成功返回-1(EOF),那么我们可以使用while语句
int ch = 0;
while ((ch = fgetc(pfread)) != EOF)
{
fputc(ch, pfwrite);
}
再讲返回的值写到test2.txt中
完整代码如下:
#include
int main()
{
FILE* pfread = fopen("test1.txt", "r");
if (pfread == NULL)
{
perror("fopen->test1.txt");
return -1;
}
FILE* pfwrite = fopen("test2.txt", "w");
if (pfwrite == NULL)
{
fclose(pfread);
perror("fopen->test2.txt");
return -1;
}
int ch = 0;
while ((ch = fgetc(pfread)) != EOF)
{
fputc(ch, pfwrite);
}
fclose(pfread);
fclose(pfwrite);
pfread = NULL;
pfwrite = NULL;
return 0;
}
fgets用于从文件流中读取字符串,其原型如下:
char *fgets(char *str, int num, FILE *stream);
fgets 函数会从指定的文件流 stream 中读取字符,直到发生以下几种情况之一:
在任何情况下,fgets 都会在字符串末尾加上 null 终止符 \0 来确保字符串的正确终止。
这里我们可以通过观察代码来理解:
在test1.txt中放入abcdefgh,定义一个字符数组来读取:
int main()
{
FILE* pf=fopen("test1.txt", "r");
if (pf == NULL)
{
return 1;
}
char arr[20] = "xxxxxxxxxxxxxxxx";
fgets(arr, 7, stdin);
fclose(pf);
pf = NULL;
return 0;
}
如果函数执行成功,则返回 str(指向字符串的指针)。如果读取失败或遇到文件结束符且没有读取任何字符,则返回 NULL。
举例如下:
int main() {
FILE* file;
char buffer[100];
// 打开文件
file = fopen("test1.txt", "r");
if (file == NULL) {
perror("fopen");
return -1;
}
// 使用fgets从文件中读取一行
if (fgets(buffer, 100, file) != NULL) {
printf("读取的字符串: %s\n", buffer);
}
else {
printf("读取失败或文件已结束\n");
}
// 关闭文件
fclose(file);
return 0;
}
我们test1.txt中仍放入abcde;
buffer用于接收
运行结果如下:
fputs用于向文件流中写入一个字符串,其原型如下:
int fputs(const char *str, FILE *stream);
现在我们再进行演示,将test1.txt文件写入test2.txt中
首先,打开两个文件:
char buffer[100];
// 打开文件
FILE* firead= fopen("test1.txt", "r");
FILE* fiwrite= fopen("test2.txt", "w");
if (firead == NULL) {
perror("fopen->test.txt");
return -1;
}
if (fiwrite == NULL) {
perror("fopen->test2.txt");
return -1;
}
再进行读写:
while (fgets(buffer, 100, firead) != NULL) {
if (fputs(buffer, fiwrite) != EOF)
{
printf("写入成功");
}
else
printf("失败");
}
// 关闭文件
fclose(firead);
fclose(fiwrite);
return 0;
讲fprintf之前,先提一下printf函数
printf:
int printf(const char *format, ...);
printf("%d",num);
而fprintf函数,它的原型如下:
int fprintf(FILE *stream, const char *format, ...);
与printf不同的是它多了一个流;
fprintf 会根据提供的格式字符串,将数据格式化后写入指定的文件流。它在成功写入时返回写入的字符数,失败时返回负值。
对比
例如:
FILE *file = fopen("output.txt", "w");
if (file != NULL) {
fprintf(file, "The number is: %d\n", 42);
fclose(file);
}
打开一个output.txt的文件,写入The number is: a这部分内容
fscanf
fscanf 函数从文件流读取格式化输入
int fscanf(FILE *stream, const char *format, ...);
fscanf 会尝试按照指定的格式从文件流中读取数据,并将读取的数据存储在提供的地址上。成功时,它返回成功匹配并赋值的数据项数量****(读取成功n个则返回n)。如果到达文件末尾或发生读取错误,它返回 EOF
同样对比scanf函数:
int scanf(const char *format, ...);
scanf 与 fscanf 非常相似,唯一的区别是 scanf 读取标准输入(如用户在键盘上的输入),而不是从一个文件流读取。它同样返回成功匹配并赋值的数据项数量,或者在遇到输入错误时返回 EOF。
对比
假设从写好的output文件中读取
int main() {
FILE* file = fopen("output.txt", "r"); // 打开文件用于读取
int a;
if (file != NULL) {
// 使用fscanf读取文件中的整数
if (fscanf(file, "The number is: %d\n", &a) == 1) {
fprintf(stdout,"读取的整数是:%d\n", a);
}
else {
fprintf(stdout,"读取失败\n");
}
fclose(file); // 关闭文件
}
else {
perror("打开文件失败");
return 1;
}
return 0;
}
与上面六种函数不同的是,上述函数均为文本类或字符类输入输出,而fread和fwrite函数用于二进制的输入和输出。
fwrite
fwrite 函数用于向文件中写入数据,它的函数原型:
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
举例:现在将数字1000写入我的output.txt文件中:
int main() {
FILE *file;
int number = 1000;
// 打开文件用于二进制写入
file = fopen("output.txt", "wb");
if (file == NULL) {
perror("Error opening file");
return 1;
}
// 使用fwrite写入二进制数
fwrite(&number, sizeof(int), 1, file);
// 关闭文件
fclose(file);
return 0;
}
我们会发现它的内容是不可读的
我们再用fread读取.
fread
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
我们会发现两个函数参数相同,无非就是一个读,一个写;
那么用fread读取刚刚的output.txt文件:
#include
int main() {
FILE *file;
int number;
// 打开文件用于二进制读取
file = fopen("output.txt", "rb");
if (file == NULL) {
perror("Error opening file");
return 1;
}
// 使用fread读取二进制数
size_t itemsRead = fread(&number, sizeof(int), 1, file);
if (itemsRead == 1) {
printf("读取的整数是:%d\n", number);
} else {
// 如果没有读取到一个整数,打印错误信息
if (feof(file)) {
printf("文件结束,未读取到数据。\n");
}
if (ferror(file)) {
printf("读取文件时出错。\n");
}
}
// 关闭文件
fclose(file);
return 0;
}