C语言文件读写常用函数

文件的顺序读写

在读写之前,仍然要先用fopen打开文件

功能函数名适用于
字符输入函数fgetc所有输入流
字符输出函数fputc所有输出流
文本行输入函数fgets所有输入流
文本行输出函数fputs所有输出流
格式化输入函数fscanf所有输入流
格式化输出函数fprintf所有输出流
二进制输入fread文件
二进制输出fwrite文件

fputc:

函数原型:int fputc ( int character, FILE * stream );

返回值:成功时,返回写入的字符。 如果发生写入错误,则返回EOF并设置错误指示符(ferror)。

FILE* pf = fopen("F:\\DEV(C)\\test.txt", "w");
if (pf == NULL)
{
	perror("fopen");
	return 1;
}
//使用
fputc('a', pf);
fputc('b', pf);
fputc('c', pf);		//往test.txt文件中写入abc三个字符
//释放
fclose(pf);
pf = NULL;

fgetc:

函数原型:int fgetc ( FILE * stream );

返回值:成功时,返回读取的字符(提升为int值)。 返回类型为int,以适应表示失败的特殊值EOF;如果位置指示符在文件末尾,函数返回eof并设置流的EOF指示符(feof)。 如果发生其他读取错误,该函数也会返回EOF,但会设置其错误指示器(ferror)。

(函数在读取结束的时候会返回EOF;正常读取的时候,返回的是读取到的字符的ASCII码值)

FILE* pf1 = fopen("F:\\DEV(C)\\test.txt", "r");
if (pf1 == NULL)
{
	perror("fopen");
	return 1;
}
int ret = fgetc(pf1);	//从文件指针pf1指向的文件中读取字符,函数返回值是int类型
printf("%c", ret);

所有输出、输入流表示:无论是文件流,还是标准输入输出流都可以,如可以用fputc向标准输出流输出信息

fputc('b', stdout);		//stdout是标准输出流,该语句会将字符b通过控制台输出到屏幕上
int ret = fgetc(stdin);	//从标准输入流(读取字符,函数返回值是int类型
printf("%c",ret);

fputs:

函数原型:int fputs ( const char * str, FILE * stream );

返回值:如果成功,将返回一个非负值。 出错时,该函数返回EOF并设置错误指示器(ferror)。

FILE* pf = fopen("F:\\DEV(C)\\test.txt", "w");
if (pf == NULL)
{
	perror("fopen");
	return 1;
}
fputs("abcdef\n", pf);
fputs("ghijkl\n", pf);		//往pf指向的文件写入字符串,想要换行效果需手动加上\n
fclose(pf);
pf = NULL;

fgets:

函数原型:char * fgets ( char * str, int num, FILE * stream );

str:指向一个字符数组的指针,读取的字符串被复制到这个数组中。

num:要复制到str中的最大字符数(包括终止空字符),例如要读取6个字符,只会读取5个,最后一个放\n

stream:指向标识输入流的文件对象的指针。 stdin可以用作从标准输入中读取的参数。

返回值:如果成功,该函数将返回str。 如果在试图读取字符时遇到文件结尾,则设置eof指示符(feof)。如果这发生在任何字符可以被读取之前,那么返回的指针是一个空指针(并且str的内容保持不变)。 如果发生读取错误,则设置错误指示符(ferror)并返回空指针(但str指向的内容可能已经改变)。

(函数在读取结束的时候会返回NULL;正常读取的时候,返回存放字符串的空间起始地址)

FILE* pf = fopen("F:\\DEV(C)\\test.txt", "r");
if (pf == NULL)
{
	perror("fopen");
	return 1;
}

char arr[10] = {"xxxxxxxx"};
fgets(arr, 5, pf);		//假如文件内容是abcdef,则读取abcd\0放到arr数组中

//释放
fclose(pf);
pf = NULL;

fprintf:

函数原型:int fprintf ( FILE * stream, const char * format, … );

printf的函数原型:int printf ( const char * format, … );

可看到fprintf函数比printf函数多了一个指向文件类型的指针,后续参数用法跟printf函数一样,…表示的参数是可变参数;表示把格式化数据写入到流中

返回值:如果成功,将返回写入的字符总数。 如果发生写入错误,将设置错误指示器(ferror ),并返回一个负数。 如果在写入宽字符时出现多字节字符编码错误,errno将设置为EILSEQ,并返回一个负数。

struct S
{
	int a;
	char arr[6];
	float b;
};

struct S p = { 10,"abcde",5.0 };
FILE* pf = fopen("F:\\DEV(C)\\test.txt", "w");
if (pf == NULL)
{
    perror("fopen");
    return 1;
}
//使用fprintf写入结构体数据
fprintf(pf, "%d %s %f", p.a, p.arr, p.b);
//释放
fclose(pf);
pf = NULL;

fscanf:

函数原型:int fscanf ( FILE * stream, const char * format, … );

scanf的函数原型:int scanf ( const char * format, … );

所以fscanf也只是比scanf函数多了个指向文件类型的指针,加上就能用;表示从流中读取格式化内容到指定位置

返回值:如果成功,该函数将返回成功填充的参数列表的项数。由于匹配失败、读取错误或到达文件结尾,此计数可能与预期的项数匹配,也可能小于预期的项数(甚至为零)。 如果在读取时发生读取错误或到达文件结尾,则设置适当的指示器(feof或ferror)。并且,如果在成功读取任何数据之前发生任何一种情况,将返回EOF。 如果解释宽字符时出现编码错误,该函数将errno设置为EILSEQ。

struct S
{
	int a;
	char arr[6];
	float b;
};

struct S p = { 0 };
FILE* pf = fopen("F:\\DEV(C)\\test.txt", "r");
if (pf == NULL)
{
    perror("fopen");
    return 1;
}
//使用fscanf以结构体形式读取文件,将pf指向的文件内容读取到结构体变量中
fscanf(pf, "%d %s %f", &(p.a), p.arr, &(p.b));
//再打印读取到的结构体内容到屏幕上
printf("%d %s %f", p.a, p.arr, p.b);
//释放
fclose(pf);
pf = NULL;

fwrite:

函数原型:size_t fwrite ( const void * ptr, size_t size, size_t count, FILE * stream );

ptr:指向要写入的元素数组的指针,转换为const void*。即要将什么内容写到文件里

size:要写入的每个元素的字节大小。 size_t是一个无符号整型。

count:写入元素的数量,每个元素的大小为字节。

stream:指向指定输出流的文件对象的指针。即向哪个文件写入

返回值:返回成功写入的元素总数。 如果该数字与count参数不同,则是写错误导致函数无法完成。在这种情况下,将为该流设置错误指示器(ferror)。 如果size或count为零,则函数返回零,错误指示器保持不变。

struct S
{
	int a;
	char arr[6];
	float b;
};
struct S p = {10,"abcde",3.14f};
FILE* pf = fopen("F:\\DEV(C)\\test.txt", "w");
if (pf == NULL)
{
    perror("fopen");
    return 1;
}
//使用fwrite往文件中写入二进制内容,写入后文件内容看不懂的,是二进制形式
fwrite(&p,sizeof(struct S),1,pf);/*将结构体变量p,以二进制形式写入pf指针指向的文件里,写入数量为一个,大小是结构体的大小*/
//释放
fclose(pf);
pf = NULL;

fread:

函数原型:size_t fread ( void * ptr, size_t size, size_t count, FILE * stream );

ptr:指向至少(size * count)字节大小的内存块的指针,转换为void。即待读取文件的内容后放到哪里

size:要读取的每个元素的大小,以字节为单位。

count:读取元素的数量,每个元素的大小为字节。

stream:指向指定输入流的文件对象的指针。即向哪个文件读取。

返回值:返回成功读取的元素总数。 如果此数字与count参数不同,则可能是发生了读取错误,或者是在读取时到达了文件结尾。在这两种情况下,都会设置适当的指示器,可以分别使用ferror和feof进行检查。 如果size或count为零,函数返回零,流状态和ptr指向的内容保持不变。

(函数在读取的时候,返回的是实际读取到的完整元素的个数;如果发现读取到的完整的元素的个数小于指定的元素个数,这就是最后一次读取了。)

struct S
{
	int a;
	char arr[6];
	float b;
};
struct S p = {0};
FILE* pf = fopen("F:\\DEV(C)\\test.txt", "r");
if (pf == NULL)
{
    perror("fopen");
    return 1;
}
//使用fread向文件以二进制形式读取内容
fread(&p,sizeof(struct S),1,pf);/*将pf指向文件里的二进制内容读取到结构体变量p中,读取数量为一个,大小为结构体大小*/
//再将读取到的内容打印出来
printf("%d %s %f", p.a, p.arr, p.b);
//释放
fclose(pf);
pf = NULL;
  • 6
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值