fwrite写入文件、fgets读取文件内容
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream) //以二进制形式对文件进行操作
ptr -- 这是指向要被写入的元素数组的指针。
size -- 这是要被写入的每个元素的大小,以字节为单位。
nmemb -- 这是元素的个数,每个元素的大小为 size 字节。
stream -- 这是指向 FILE 对象的指针,该 FILE 对象指定了一个输出流。
成功返回写入的元素总数。否则返回空,可能发生了一个错误或者到达了文件末尾。
char *fgets(char *str, int n, FILE *stream)
str -- 这是指向一个字符数组的指针,该数组存储了要读取的字符串。
n -- 这是要读取的最大字符数(包括最后的空字符)。通常是使用以 str 传递的数组长度
stream -- 这是指向 FILE 对象的指针,该 FILE 对象标识了要从中读取字符的流。
遇到换行符结束返回0
如果成功,该函数返回相同的 str 参数。如果到达文件末尾或者没有读取到任何字符,str 的内容保持不变,并返回一个空指针。
如果发生错误,返回一个空指针。
示例:
#include <stdio.h>
#include <string.h>
#define _CRT_SECURE_NO_WARNINGS
int main()
{
char* str = "世界,\n你好。";
FILE* file = NULL;
file = fopen("C:\\Users\\xx\\Desktop\\test.txt", "r+"); //此处的路径需要根据实际情况更改
if (file==NULL) { //判断是否成功打开文件
printf("读取失败");
return -1;
}
if (fwrite(str, sizeof(str[0]), strlen(str), file)) //将str内容写入文件
printf("写入成功\n");
else printf("写入失败");
/********从文件读取我们刚刚写入的内容********/
char str2[20] = { 0 }; //定义字符串数组并初始化为空
rewind(file); //将file的位置指针重新指向流(数据流/文件)的开头,这一步必须有,此步很重要,否则会读取失败
while (1)
{
if (fgets(str2, 20, file) == 0) break; //将所有内容读取并打印出来,fgets函数一次只能读取一行
printf("%s", str2);
}
fclose(file); //关闭打开的文件
return 0;
}
fprintf写入文件,fscanf读取文件
int fprintf(FILE *stream, const char *format, ...) //写入
发送格式化输出到流 stream 中。
如果成功,则返回写入的字符总数,否则返回一个负数。
例如:fprintf(fp, "%s %s %s %d", "We", "are", "in", 2021);
int fscanf(FILE *stream, const char *format, ...) //读取
从流 stream 读取格式化输入。
如果成功,该函数返回成功匹配和赋值的个数。如果到达文件末尾或发生读错误,则返回 EOF。
例如:fscanf(fp, "%s %s %s %d", str1, str2, str3, &year);
示例:
#include <stdio.h>
#include <string.h>
#define _CRT_SECURE_NO_WARNINGS
typedef struct MyStruct //要写入文件的数据类型
{
char name[8];
int age;
}MyStruct;
int main()
{
MyStruct arry[5] = { 0 };
for (size_t i = 0; i < 5; i++)
{
scanf("%s%d", arry[i].name, &(arry[i].age)); //从控制台循环读取五组数据
}
FILE* file = NULL;
file = fopen("C:\\Users\\xx\\Desktop\\test.txt", "w+"); //路径根据实际情况更改
if (file == NULL) { //判断是否成功打开文件
printf("读取失败");
return -1;
}
for (size_t i = 0; i < 5; i++)
{
fprintf(file,"%s %d\n", arry[i].name, arry[i].age); //循环写入数据
}
fflush(file); //该函数作用使数据立即被写入文件
rewind(file); //将文件中位置指针指向文件首
MyStruct arry2[6] = { 0 }; //读取文件的结构体数组
for (size_t i = 0; i < 5; i++)
{
fscanf(file,"%s %d",arry2[i].name,&arry2[i].age); //循环读取
}
for (size_t i = 0; i < 5; i++)
{
printf("%s%d\n", arry2[i].name, arry2[i].age);//循环打印出数据
}
fclose(file); //关闭打开的文件
return 0;
}
运行结果,红线以上是输入,红线以下是输出。