按行读文件---->fgets函数
文件 函数 ---- 按行
2023-09-14 09:13:38 时间
函数原型:
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<stdio.h>
#include<string.h>
#include<stdlib.h>
//按行向文件写入
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<stdio.h>
#include<string.h>
#include<stdlib.h>
//按行向文件写入
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<stdio.h>
#include<string.h>
#include<stdlib.h>
//按行向文件写入
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<stdio.h>
#include<string.h>
#include<stdlib.h>
//按行向文件写入
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;
}
相关文章
- Jenkins pipeline 如何到子文件中去执行命令
- fopen函数打开文件失败原因_为什么打开文件失败
- 敏感文件/目录扫描工具 dirsearch「建议收藏」
- Python 批量插入100万级数据到Excel文件(简洁版)
- 【C 语言】文件操作 ( 使用 fseek 函数生成指定大小文件 | 偏移量 文件字节数 - 1 )
- 【C 语言】文件操作 ( remove 函数删除文件 | rename 函数重命名文件 | 代码示例 )
- 【C 语言】文件操作 ( 配置文件读写 | 框架搭建 | 头文件定义 | 头文件导入限制 | 兼容 C++ 语言 | 函数形参输入输出属性注释)
- 解决Linux用户模板文件被删除后显示不正常问题详解程序员
- Linux 下查看及删除文件的方式(linux查看删除文件)
- js base64转file文件详解编程语言
- Linux查看网络文件的简单方法(linux查看网络文件)
- Oracle 导入文件:完美解决方案(oracle导入文件)
- 文件Linux Vi 操作:切换文件的技巧(linuxvi切换)
- Linux文件系统:解析不同文件类型(linux文件的类型)
- 夹大小Linux下查看文件夹大小的方法(linux中查看文件)
- logMySQL Binlog日志文件分析与管理(%mysql% bin)
- 如何利用oracle从txt文件导入查询数据(oracle从txt查询)
- JSP读取文件实例
- JXTree对象,读取外部xml文件数据,生成树的函数
- 可以获得文件的文件名的asp函数
- Delphi中判断文件是否为文本文件的函数
- Python常见文件操作的函数示例代码
- PHP备份数据库生成SQL文件并下载的函数代码
- 使用jQuery清空file文件域的解决方案