你是否真的会用C语言逐行读取文本文件中的串?(请不要栽倒在诡异的feof上)

本文介绍了一种使用C语言正确读取文本文件的方法,特别关注如何避免使用feof带来的问题,包括忽略空行和处理不同情况下的换行符。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

      之前说过诡异的feof, 也说过如何用C++逐行读取文本文件的串。但是,如果用C语言去做,就不那么简单了,尽管看似简单。下面是正确的程序,需要好好琢磨。我曾经在这个小问题上浪费不少时间,大家引以为戒。

 

      直接上代码(读取的时候,忽略空行):

#include <stdio.h>
#include <string.h>

int main()
{
	char buf[100] = {0};
	FILE *fp = fopen("1.txt", "r");
	
	while(!feof(fp))
	{
		/*
		为了防止feof多读取最后一行的问题,设文本文件的3行为:
		1行 a
		2行 b
		3行为空

		如果没有下面这个判断,那么程序会多读一行,错误!诡异的feof!
		*/
		if(NULL == fgets(buf, sizeof(buf), fp))
		{
			continue;
		}

		/*
		下面语句的作用是过滤掉空行,当然,如果你不想滤掉空行,那也不是去掉下面这个部分那么简单
		设文本文件的3行为:
		1行 a
		2行 b
		3行为空

		如果仅仅把下面这部分去掉,那么最后的空行也不会显示,因为上面的if中有continue
		*/
		if(0 == strcmp(buf, "\n"))
		{
			continue;
		}

		/*
		设文本文件有3行,记为
		1行 a
		2行 b
		3行 c

        那么读取第1、2行的时候,字符串带了换行符,读取第三行的时候,没有换行符,所以要分别进行处理
		*/
		int len = strlen(buf);
		if('\n' == buf[len - 1])
		{
			buf[len - 1] = '\0'; // 去掉'\n'字符
			len--;
		}

		printf("%s\n", buf);
	}

	fclose(fp);

	return 0;
}


      睡觉。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值