l5-d3 标准IO的读写(字符、行)

一、读写单个字符

1.读写流

流支持不同的读写方式:

读写一个字符:fgetc()/fputc()一次读/写一个字符

读写一行:fgets()和fputs()一次读/写一行

读写若干个对象:fread()/fwrite() 每次读/写若干个对象,而每个对象具有相同的长度

2.按字符输入

下列函数用来输入一个字符:

#include  <stdio.h>

int  fgetc(FILE *stream);

int  getc(FILE *stream);   //

int  getchar(void);

成功时返回读取的字符;若到文件末尾或出错时返回EOF(-1

getchar()等同于fgetc(stdin)

getc和fgetc区别是一个是宏一个是函数

注意事项:

函数返回值是int类型不是char类型,主要是为了扩展返回值的范围;

stdin 也是FILE *的指针,是系统定义好的,指向的是标准输入(键盘输入);

打开文件后读取,是从文件开头开始读。读完一个后读写指针会后移。读写注意文件位置;

调用getchar会阻塞,等待你的键盘输入。

#include <stdio.h>

int main(int argc,char *argv[]){
   
    FILE *fp;
    int rec;
    fp = fopen("1.txt","r");
    if(fp==NULL){
        perror("fopen");
        return 0;
    }
    rec = fgetc(fp);
    printf("Get char=%c\n",rec);
    rec = fgetc(fp);
    printf("Get char=%c\n",rec);
    rec = fgetc(fp);
    printf("Get char=%c\n",rec);
    fclose(fp);
}
#include <stdio.h>

int main(int argc,char *argv[]){
   
    FILE *fp;
    int rec;
    if(fp==NULL){
        perror("fgetc");
        return 0;
    }
    rec = fgetc(fp);
    if(rec==-1){
       perror("fgetc");
       fclose(fp);
       return 0;
    }
    printf("Get char=%c\n",rec);
    
    rec = getchar();
    printf("Get STD input=%c\n",rec);
    
    fclose(fp);
}

3.按字符输出

下列函数用来输出一个字符:

#include  <stdio.h>

int  fputc(int c, FILE *stream);

int  putc(int c, FILE *stream);

int  putchar(int c);

成功时返回写入的字符;出错时返回EOF

putchar(c)等同于fputc(c, stdout)

注意事项

1返回和输入参数都是int类型

2遇到这种错误:Bad file descriptor,  很可能是文件打开的模式错误(只读模式去写,只写模式去读)

#include <stdio.h>

int main(int argc,char *argv[]){
   
    FILE *fp;
    int rec;
    fp = fopen("1.txt","a+");
    if(fp==NULL){
        perror("fopen");
        return 0;
    }

    int wrc='w';
    rec = fputc(wrc,fp);
    if(rec==-1){
       perror("fputc");
       fclose(fp);
       return 0;
    }
    putchar(wrc);

    fclose(fp);
} 

 读写若干个对象:fread()/fwrite() 每次读/写若干个对象,而每个对象具有相同的

二、按行输入文件

下列函数用来输入一行:

#include  <stdio.h>

char  *gets(char *s);

char *fgets(char *s, int size, FILE *stream);

成功时返回s,到文件末尾或出错时返回NULL

gets不推荐使用,容易造成缓冲区溢出

遇到’\n’或已输入size-1个字符时返回,总是包含’\0’

#include <stdio.h>

int main(int argc,char *argv[]){
    FILE *fp;
    char *ret;
    int retn;
    char buff[100];
    fp = fopen("1.txt","a+");
    if(fp==NULL){
	perror("fopen");
        return 0;

    }

    ret = fgets(buff,5,fp);
    if(ret==NULL){
	    perror("fgets");
        fclose(fp);
        return 0;
    }
    printf("buff=%s\n",buff);
}

注意事项:

gets函数已经被淘汰,因为会导致缓冲区溢出。

fgets 函数第二个参数,输入的数据超出size,size-1个字符会保存到缓冲区,最后添加’\0’,如果输入数据少于size-1 后面会添加换行符。

三、按行输出文件

下列函数用来输入字符串

int  puts(const char *s);

int fputs(const char *s,  FILE *stream);

成功时返回非负整数;出错时返回EOF

puts将缓冲区s中的字符串输出到stdout,并追加’\n’

fputs将缓冲区s中的字符串输出到stream,不追加‘\n’

#include <stdio.h>

int main(int argc,char *argv[]){
   
    FILE *fp;
    int rec;
    fp = fopen("1.txt","a+");
    if(fp==NULL){
        perror("fopen");
        return 0;
    }
    retn = fputs("hello world",fp);
    if(retn==-1){
	perror("fputs");

    }
    printf("hahaha\n");
    
    fclose(fp);
}

四、作业

完成按行输出文件实验,并提交实验截图

#include <stdio.h>

int main(int argc, char* argv[]) {
    FILE * fp;
    char ch[20] = "abcdefg";
    int ret;
    fp = fopen("1.txt", "a+");

    if (fp == NULL) {
        perror("fopen");
        return 0;
    }

    ret = fputs("hello world", fp);
    if (ret == -1) {
        perror("fputs");
    }
    puts(ch);

    printf("hahaha\n");

    fclose(fp);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值