C语言:每行字符数量不确定时,怎样按行读取文本文件

我当然知道简单的按行读取文本文件的博客在csdn上俯拾皆是,无非用fgets,fscanf,或者fread,但是这都是在我们已经知道或者能够大概估计每行所含字符数上限的情况下的做法,如果我们不清楚且无法估计每行有多少个字符那我们该怎么做呢??

文章目录

  • 1.思路
  • 2.代码
  • 3.程序运行效果
  • 4.结束语

1.思路

1.很多按行读取的博客都使用

char * fgets(char *__restrict__ _Buf, int _MaxCount, FILE *__restrict__ _File)
size_t fread(void *__restrict__ _DstBuf, size_t _ElementSize, size_t _Count, FILE *__restrict__ _File)
int fscanf(FILE *__restrict__ _File, const char *__restrict__ _Format, ...)

以上这三种形式来读取,但是这些函数都需要我们给出读取的上限大小,局限性非常大。
2.
这里我们的解决方法是依靠于文件中的换行符。

当我们在文本文件中换行时,虽然我们肉眼只能看见光标去到了下一行
的开头,但实际上在文件存储时每一行的末尾还储存着一个换行符。
Windows和Linuxs等系统关于换行符存在的差异这里我们不作描述。

所以我们只需要检测换行符的位置即可,用fgetc函数进行单字符读取,一旦读取到换行符就输出之前储存起来的字符。(唯一一点要注意的就是文件末尾EOF结束符的检测,要单独写出来,不然会出现bug)

2.代码

下面是我写的一个简单的demo。
我事先在一个文本文件中随机打入一些字符(多行,且行内可能有空格字符),然后对其进行按行读取并输出到控制台。
下面是代码:

#include 
#include 

#define filepath "e:info.txt" //文件路径
#define MAXLEN 100 //这里优化成为动态数组,就可以彻底摆脱字符数量未知的限制

int main(void) {
    
    FILE *fp = fopen(filepath, "r");
    if (!fp) {printf("file open error!\n"); system("pause"); exit(0);}

    char target[MAXLEN] = {}, mark; int i, flag;
    while (fread(&mark, 1, 1, fp) != 0 && !fseek(fp, -1, SEEK_CUR)) {
        i = 0;
        while (1) {
        	//判断是否换行或者到达文件末尾
            if ('\n' == (flag = fgetc(fp)) || flag == EOF) break;
            target[i++] = flag;
        }
        EOF != flag ? target[i] = flag, target[i + 1] = '\0' : (target[i] = '\0');
        fprintf(stdout, "%s", target);
    }
	//收尾工作
    putchar('\n');
    system("pause");
    fclose(fp);
    return 0;

}

3.程序运行效果

首先看看原来的文本文件中的内容:
C语言:每行字符数量不确定时,怎样按行读取文本文件_第1张图片
可以看到是随机字符且中间有空格。
这里由空格引起的一个问题就是如果使用fscanf读取文件,遇见空格就会结束读取,很显然不符合要求。
下面是程序运行结果:
C语言:每行字符数量不确定时,怎样按行读取文本文件_第2张图片
可以看到完全正确的输出了结果。

4.结束语

文件读取里面的学问以及注意事项还是蛮多的,并且我也觉得非常有意思,但是需要我们去实践才能体会到。并且写这个程序时遇到了一个左值问题,也困扰了我很多次,下次博客会记录下来。
感谢支持~

你可能感兴趣的:(那些年我们一起踩过的坑,c语言,c++,printf,算法)