C语言——>按字符读写文件

按字符读写文件

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

读写文件中的字符

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

int fgets(FILE *fp);

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

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

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

int fputc(int c,FILE *fp);

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

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

#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

#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()来判断是否读到文件末尾。

#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()来判断是否读道文本的末尾

while(!feof(fp))
{
    ch = fgetc(fp);
    if (isprint(ch))
        printf("%c\t",ch);
    else
        printf("%d\t",ch);
}

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

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

if(!iscntrl(ch))

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

读写文件中的字符串

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

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

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

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

使用

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

fputs()函数

int fputs(const char *s,FILE *fp)
#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()不会早写入文件的字符串末尾加上换行符。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值