C语言按行读取文本文件


一般来说,计算机文件可以分为两类: 文本文件和二进制文件

文本文件是一种由若干行字符构成的计算机文件。文本文件存在于计算机文件系统中。通常,通过在文本文件最后一行后放置文件结束标志来指明文件的结束。

文本文件具有可读性,一般我们用的txt文件,log文件都是文本文件,其由字符构成,故我们就按字符处理,按行读取(linux下由’\n’字符换行,wondows下由’\r’’\n’组合一起换行)。

C标准库函数
函数声明

FILE *fopen(const char *path, const char *mode);
char *fgets(char *s, int size, FILE *stream);
int feof(FILE *stream);
int fclose(FILE *stream);

fopen(): 使用给定的模式 mode 打开 path 所指向的文件,成功返回FILE指针。
fgets(): 从指定的流 stream 读取一行,并把它存储在 s 所指向的字符串内。当读取 (size-1) 个字符时,或者读取到换行符时,或者到达文件末尾时,它会停止。读到文件末尾或者出错时,返回NULL。
feof():测试给定流 stream 的文件结束标识符。到达文件尾时返回EOF
fclose():关闭流 stream。刷新所有的缓冲区。

使用fopen打开文件,使用fgets循环读取每行文件,使用feof判断是否读完文件,使用fclose关闭文件。

下面提供一个示例,仅供参考:
实现了读取输出除空行外的每一行数据,返回文本的总行数

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

// 每行最大长度
#define LINE_MAX 1024

/**
 *@para   path 输入文件路径
 *@return 文件行数
 */
int read_line(char *path)
{
	FILE *fp;
	int line_num = 0; // 文件行数
	int line_len = 0; // 文件每行的长度
	char buf[LINE_MAX] = {0}; // 行数据缓存

	fp = fopen(path, "r");
	if (NULL == fp) {
		printf("open %s failed.\n", path);
		return -1;
	}

	while(fgets(buf, LINE_MAX, fp)) {
		line_num++;
		line_len = strlen(buf);
		// 排除换行符
		if ('\n' == buf[line_len - 1]) {
			buf[line_len - 1] = '\0';
			line_len--;
			if (0 == line_len) {
				//空行
				continue;
			}
		}
		// windos文本排除回车符
		if ('\r' == buf[line_len - 1]) {
			buf[line_len - 1] = '\0';
			line_len--;
			if (0 == line_len) {
				//空行
				continue;
			}
		}
		printf("%s\n", buf);
		/** 对每行数据(buf)进行处理 **/
	}

	if (0 == feof) {
		// 未读到文件末尾
		printf("fgets error\n");	
		return -1;
	}
	fclose(fp);

	return line_num;
}

int main(int argc, char *argv[])
{
	int line_num = read_line(argv[1]);
	printf("line_num = %d\n", line_num);
	return 0;
}

测试:
ubuntu1604,linux环境下运行

mao@ubuntu:~$ cat a.txt
aaaa
bbbb
cccc
mao@ubuntu:~$ cat b.txt
1234

34153
1111122
3
mao@ubuntu:~$ ./a.out a.txt 
aaaa
bbbb
cccc
line_num = 3
mao@ubuntu:~$ ./a.out b.txt 
1234
34153
1111122
3
line_num = 5
mao@ubuntu:~$ 
Logo

科技之力与好奇之心,共建有温度的智能世界

更多推荐