C语言按字符读写文件

按字符读写文件

ANSI C提供了丰富的文件读写函数。包括按字符读写,按数据块读写,按格式读写等。

读写文件中的字符

​ 函数fgetc()用于从一个以只读或读写方式打开的文件上读字符。fgetc()函数的原型为:

1
int fgets(FILE *fp);

其中fp是由函数fopen()返回的文件指针。

功能:从fp所指的文件中读取一个字符,并将位置指针指向下一个字符。若读取成功则返回该字符,若读到文件末尾,则返回EOF(EOF是一个符号常量,在stdio.h中定义为-1)

​ 函数fputc()用于将一个字符写到一个文件上。fputc()的函数原型为:

1
int fputc(int c,FILE *fp);

其中fp是由函数fopen()返回的文件指针。c是要输出的字符(尽管C定义为int型,但只能写入低字节)

功能:将字符c写在文件指针fp所指的文件中。若写入错误,则返回EOF,否则返回字符c

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <stdio.h>
#include<stdlib.h>

int main() {
FILE *fp;
char ch;
fp = fopen("D:\\demo.txt","w"); //此处也许是编译器问题,我的Clion必须加上demo所在的盘位置才行
if(fp == NULL)
{
printf("Failure to open demo.text!\n");
exit(0);
}
ch = getchar();
while(ch != '\n')
{
fputc(ch, fp);
ch = getchar();
}
fclose(fp);

return 0;
}


可以在D盘的位置找到demo.txt 确实里边写的内容和我们输入的内容一致

注意:使用getchar()输入字符时,是先将所有字符送入缓冲区,直到键入回车换行符才从缓冲区逐个读出并赋值给变量ch

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <stdio.h>
#include<stdlib.h>
int main()
{
FILE *fp;
char ch;
int i;
fp = fopen("D:\\demo.bin","wb"); //此处也许是编译器问题,我的Clion必须加上demo所在的盘位置才行
if(fp == NULL)
{
printf("Failure to open demo.bin!\n");
exit(0);
}
for(i = 0; i < 128; i++)
{
fputc(i,fp);
}
fclose(fp);
fp = fopen("D:\\demo.bin","rb"); //此处也许是编译器问题,我的Clion必须加上demo所在的盘位置
if(fp == NULL)
{
printf("Failure to open demo.bin!\n");//否则这里会报错
exit(0);
}
while((ch = fgetc(fp)) != EOF)
{
putchar(ch);
}
fclose(fp);
return 0;
}

在程序倒数的while循环中,通过检查函数fgets()的返回值是否为EOF来判断是否读到文件末尾,若读到末尾就返回EOF,即-1。

除此之外,还可以使用函数feof()来判断是否读到文件末尾。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <stdio.h>
#include<stdlib.h>
#include <ctype.h>
int main()
{
FILE *fp;
char ch;
int i;
fp = fopen("D:\\demo.bin","wb");
if(fp == NULL)
{
printf("Failure to open demo.bin!\n");
exit(0);
}
for(i = 0; i < 128; i++)
{
fputc(i,fp);
}
fclose(fp);
fp = fopen("D:\\demo.bin","rb");
if(fp == NULL)
{
printf("Failure to open demo.bin! \n");
exit(0);
}
while((ch = fgetc(fp)) != EOF)
{
if(isprint(ch))
printf("%c\t",ch);
else
printf("%d\t",ch);
}
fclose(fp);
return 0;
}

除本例使用的方法外,还可以使用函数feof()来判断是否读道文本的末尾

1
2
3
4
5
6
7
8
while(!feof(fp))
{
ch = fgetc(fp);
if (isprint(ch))
printf("%c\t",ch);
else
printf("%d\t",ch);
}

为了解决如果文本末尾的文件结束符又是一个-1,或不可打印字符不能被读出的问题

可以将isprint()判断是否可以打印字符改为函数iscntrl()判断,即将其改为:

1
if(!iscntrl(ch))

函数feof()总是在读完文件所有内容后再执行一次读文件操作(将文件结束符读走,但不显示)才能返回真(非0)值

读写文件中的字符串

从文件中读取字符串可使函数fgets()其函数原型为:

1
char *fgets(char *s, int n, FILE *fp);

作用:该函数从fp所指的文件中读取字符串末尾添加‘\0’,然后存入s,最多读n-1个字符。当读到回车符、到达文件尾或读满n-1个字符时,函数返回该字符串的首个地址。即指针s的值,读取失败时返回空指针NULL。

**函数ferror()**:用来检测是否出现文件错误,如果出现失误,则函数返回一个非0值,否则,函数返回0值

使用

1
2
if(ferror(fp))
printf("Error on file\n");

fputs()函数

1
int fputs(const char *s,FILE *fp)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include<stdio.h>
#include<stdlib.h>
#define N 80
int main()
{
FILE *fp;
char str[N];
if((fp = fopen("D:\\demo.txt","a")) == NULL)
{
printf("Failure to open demo.text! \n");
exit(0);
}
gets(str);
fputs(str,fp);
fclose(fp);
if((fp = fopen("D:\\demo.txt","r")) == NULL)
{
printf("Failure to open demo.text! \n");
exit(0);
}
fgets(str,N,fp);
puts(str);
fclose(fp);
return 0;
}

该程序可以实现对文件进行书写,但不更改源文件中的内容

在每次运行上述程序时,从键盘输入的字符串都会被添加到demo.txt的末尾

​ 与gets()不同的是,fgets()从指定的流读字符串,读到换行符时,将换行符也作为字符串的一部分读到字符串中来。同理,与puts()不同的是,fputs()不会早写入文件的字符串末尾加上换行符。

Donate
  • Copyright: Copyright is owned by the author. For commercial reprints, please contact the author for authorization. For non-commercial reprints, please indicate the source.

扫一扫,分享到微信

微信分享二维码
  • Copyrights © 2015-2023 dwx
  • Visitors: | Views:

请我喝杯咖啡吧~

支付宝
微信