【问题标题】:Read a text file line by line and retrieve the content of each line in C逐行读取文本文件并检索C中每一行的内容
【发布时间】:2014-04-21 15:53:09
【问题描述】:

假设一个文本文件是这样的:

1, 2345, 7788, 463, ABC
2, 387, 1100, 321, CCC
2, 2222, 22222, 22, DSA

所以这个文本文件有3行,我的项目需要我们实现一个函数,逐行读取这个文本文件,在读取特定行的时候取出每一行的内容,然后检查这个的内容行。

例如,我会从第一行开始读取这个文件。所以当第一行被读取时(1, 2345, 7788, 463, ABC),我首先需要将这一行存储到一个字符串中(比如说它是 char[] str),然后我需要把这个 str 分成 5 块,并且每一部分都包含由逗号分隔的五个不同的字段内容,例如 p1、p2、p3、p4 和 p5。然后我需要检查 p3 是否为“1100”。如果是,则关闭此文件并继续程序,如果不是,则我需要继续阅读第二行并做同样的事情,显然 1100 是第二行的第三个字段,所以阅读后这一行函数将终止。

现在谁能告诉我如何实现它?我对 C 很陌生,我在网上搜索了一些关于 fgets() 的信息,例如:

if (fgets(str, 60, "text.txt")!=NULL){
    puts(str);
}

但在这里我看不到任何暗示这个 frets() 逐行读取文本文件。

提前致谢! :D

【问题讨论】:

  • 我喜欢使用POSIX.1-2008 来检查文档。
  • fgets 的真正用途是一次读取一行。对于读取文件的其他方式(一次一个字符,或作为预定义长度的块),还有其他功能。

标签: c string text


【解决方案1】:

你想要这个:

char str[60];
FILE* f = fopen("text.txt", "r");
if (f == NULL) exit(1);
while(fgets(str, 60, f) != NULL){
    fputs(str, stdout);
}
fclose(f);

【讨论】:

  • 次要:建议fputs(str, stdout) 不必解释为什么输出有一个额外的'\n'
  • 您能告诉我如何准确地使用此代码逐行检查 txt 文件吗?谢谢!
  • @BillyChen:如果您运行它,您会看到它读取文件的每一行,并将其打印到控制台。如果要从每一行中提取数字,sscanf 函数将起作用。因为这听起来像是家庭作业,所以我想给你一些挑战。
  • @MikeDunlavey 谢谢迈克,让我试试!
【解决方案2】:

如何使用您的代码检查每一行?

使用@Mike 的代码,添加以下内容:

char str[60];
FILE* f = fopen("text.txt", "r");
if (f == NULL) exit(1);
while(fgets(str, 60, f) != NULL){
    if(strstr(str, "1100")  //Add these lines to test for "1100"
    {
          puts("Found 1100!", stdout);//optional
          puts(str, stdout);//optional
          fclose(f);
          return;
    } 
    fputs(str, stdout);
}
fclose(f);

【讨论】:

    【解决方案3】:
    #include <stdio.h>
    
    int main(){
        char str[64];
        int p1, p2, p3, p4;
        char p5[16];
        FILE *fp;
        int i;
        fp=fopen("text.txt", "r");
        while(fgets(str, sizeof(str), fp)!=NULL){
            if(sscanf(str, "%d, %d, %d, %d, %15s", &p1, &p2, &p3, &p4, p5)==5){
                if(p3 == 1100)
                    break;
                //do something
                puts(str);
            }
        }
        fclose(fp);
    
        return 0;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-11
      • 1970-01-01
      • 1970-01-01
      • 2013-06-08
      相关资源
      最近更新 更多