博客
关于我
按行读文件---->fgets函数
阅读量:175 次
发布时间:2019-02-28

本文共 3076 字,大约阅读时间需要 10 分钟。

函数原型:

char *fgets(char *buf, int bufsize, FILE *stream);

注意:第二个参数是最大读取字节数

参数:

*buf: 字符型指针,指向用来存储所得数据的地址。

bufsize: 整型数据,指明存储数据的大小。

stream: 文件结构体指针,将要读取的文件流。*

EOF

EOF是一个宏:#define EOF -1
文件中不存在EOF,EOF是表示文件是否结束的一个状态值
EOF文件结束标识符,以\0作为结束标识符

#define _CRT_SECURE_NO_WARNINGS#include
#include
#include
//按行向文件写入void test(){ FILE* fp = fopen("test.txt", "w"); if (fp == NULL) { printf("打开文件失败"); } char buf[120] = "拨不通的电话\n信号丢失云层上\n孩子别紧张\n生活不是竞技场\n"; fputs(buf, fp); fclose(fp);}//从文件中按行读取void test01(){ FILE* fp = fopen("test.txt", "r"); if (fp == NULL) { printf("打开文件失败"); exit(1); } char buf[120]; //feof判断读取是否到达文件结尾 while (!feof(fp)) { //每次读取文件中的一行数据 fgets(buf, sizeof(buf), fp); //因为输出的时候加了\n,在输入的时候也加了\n,说以每行之间会空出一行 //解决方法:每次循环将buf字符串倒数第二个换行符变成\0 buf[strlen(buf) - 1] = '\0'; printf("%s\n", buf); }}int main(){ test(); test01(); return 0;}

在这里插入图片描述

问题最后多出一句重复的话,并且最后一个字是?未知符号
原因:
在这里插入图片描述
不继续读取第六行是因为上一次记载的有效数据第四行结尾存在的\0,并且\n也被替换成了\0,所以不会再将光标跳转至下一行

解决方法1:将生活不是经济场最后的\n去掉,这样光标不会移动到下一行

但是乱码还是会出现,因为最后一次循环的时候会把\0前面的场字是中文,占两个自节,而替换的\0只有一个字节,因此会出现乱码

在这里插入图片描述

解决上面问题的方法:利用fegts返回值检验是否读取到了有效内容,没有直接退出循环
在这里插入图片描述
检验是否读取到有效字符
在这里插入图片描述
下面的代码还存在小问题,因为如果用户再输入的时候没有再最后一行的场字后面加上\n,便还是存在乱码,原因还是场字为中文占据两个字节,用一个字节的\0替换会有问题

#define _CRT_SECURE_NO_WARNINGS#include
#include
#include
//按行向文件写入void test(){ FILE* fp = fopen("test.txt", "w"); if (fp == NULL) { printf("打开文件失败"); } char buf[120] = "拨不通的电话信号\n丢失云层上\n孩子别紧张\n生活不是竞技场\n"; fputs(buf, fp); fclose(fp);}//从文件中按行读取void test01(){ FILE* fp = fopen("test.txt", "r"); if (fp == NULL) { printf("打开文件失败"); exit(1); } char buf[120]; //feof判断读取是否到达文件结尾 while (!feof(fp)) { //每次读取文件中的一行数据 char*ret=fgets(buf, sizeof(buf), fp); if (ret == NULL) { break; } //因为输出的时候加了\n,在输入的时候也加了\n,说以每行之间会空出一行 //解决方法:每次循环将buf字符串倒数第二个换行符变成\0 buf[strlen(buf) - 1] = '\0'; printf("%s\n", buf); }}int main(){ test(); test01(); return 0;}

在这里插入图片描述

优化代码:替换feof函数
上面不写\n出现的问题,依旧会出现,把输入的数据换成英文就可以解决

#define _CRT_SECURE_NO_WARNINGS#include
#include
#include
//按行向文件写入void test(){ FILE* fp = fopen("test.txt", "w"); if (fp == NULL) { printf("打开文件失败"); } char buf[120] = "拨不通的电话信号\n丢失云层上\n孩子别紧张\n生活不是竞技场\n"; fputs(buf, fp); fclose(fp);}//从文件中按行读取void test01(){ FILE* fp = fopen("test.txt", "r"); if (fp == NULL) { printf("打开文件失败"); exit(1); } char buf[120]; while (fgets(buf, sizeof(buf), fp)) { buf[strlen(buf) - 1] = '\0'; printf("%s\n", buf); }}int main(){ test(); test01(); return 0;}

下面的代码才是正解,有无\n均可,直接将文件中的数据以文件中的形式读取出来

#define _CRT_SECURE_NO_WARNINGS#include
#include
#include
//按行向文件写入void test(){ FILE* fp = fopen("test.txt", "w"); if (fp == NULL) { printf("打开文件失败"); } char buf[120] = "拨不通的电话信号\n丢失云层上\n孩子别紧张\n生活不是竞技场\n"; fputs(buf, fp); fclose(fp);}//从文件中按行读取void test01(){ FILE* fp = fopen("test.txt", "r"); if (fp == NULL) { printf("打开文件失败"); exit(1); } char buf[120]; while (fgets(buf, sizeof(buf), fp)) { printf("%s", buf); }}int main(){ test(); test01(); return 0;}

转载地址:http://vhwc.baihongyu.com/

你可能感兴趣的文章
Mysql中使用存储过程插入decimal和时间数据递增的模拟数据
查看>>
MySql中关于geometry类型的数据_空的时候如何插入处理_需用null_空字符串插入会报错_Cannot get geometry object from dat---MySql工作笔记003
查看>>
mysql中出现Incorrect DECIMAL value: '0' for column '' at row -1错误解决方案
查看>>
mysql中出现Unit mysql.service could not be found 的解决方法
查看>>
mysql中出现update-alternatives: 错误: 候选项路径 /etc/mysql/mysql.cnf 不存在 dpkg: 处理软件包 mysql-server-8.0的解决方法(全)
查看>>
Mysql中各类锁的机制图文详细解析(全)
查看>>
MySQL中地理位置数据扩展geometry的使用心得
查看>>
Mysql中存储引擎简介、修改、查询、选择
查看>>
Mysql中存储过程、存储函数、自定义函数、变量、流程控制语句、光标/游标、定义条件和处理程序的使用示例
查看>>
mysql中实现rownum,对结果进行排序
查看>>
mysql中对于数据库的基本操作
查看>>
Mysql中常用函数的使用示例
查看>>
MySql中怎样使用case-when实现判断查询结果返回
查看>>
Mysql中怎样使用update更新某列的数据减去指定值
查看>>
Mysql中怎样设置指定ip远程访问连接
查看>>
mysql中数据表的基本操作很难嘛,由这个实验来带你从头走一遍
查看>>
Mysql中文乱码问题完美解决方案
查看>>
mysql中的 +号 和 CONCAT(str1,str2,...)
查看>>
Mysql中的 IFNULL 函数的详解
查看>>
mysql中的collate关键字是什么意思?
查看>>