【问题标题】:In C, how to print out a txt file line by line?在C中,如何逐行打印出一个txt文件?
【发布时间】:2016-05-13 20:40:40
【问题描述】:
int main()
{
   FILE *infile;
   FILE *infile2;
   char input[255],input2[255];
   int status1, status2;

   infile = fopen("test.txt", "r");
   infile2 = fopen("test2.txt", "r");
   if(infile == NULL)
   {
      printf("Can not open file 1!\n");
   }
   else if(infile2 == NULL)
   {
      printf("Can not open file 2!\n");
   }
   else
   {
      do
      {
        status1 = fscanf(infile, "%s", &input);
        status2 = fscanf(infile2, "%s", &input2);

        printf("File 1: %s\n File 2: %s\n", input, input2);
     }while(status1 != -1 || status2 != -1);
   }
   fclose(infile);
   fclose(infile2);

   return 0;
}

我的输出如下所示:

Output

我想在一行中打印出文件 1,而不是逐字打印。文件 2 也是如此。我对C有点陌生,所以我被卡住了。

【问题讨论】:

  • 使用while (fgets(input, sizeof input, infile)) {...}
  • 你的代码很容易出错。如果第一个文件比第二个文件短/长,会发生什么?无论如何,您都使用scanf,因为如果 either status1 or status2 不是-1,则进入while 循环。

标签: c file text fopen


【解决方案1】:

如果您想阅读整行,请使用fgets 函数而不是fscanf

char *status1, *status2;
   .
   .
   .
do {
    status1 = fgets(input, sizeof(input), infile);
    status2 = fgets(input2, sizeof(input2), infile2);
    printf("File 1: %s File 2: %s", input, input2);
} while (status1 || status2);

注意printf 如何不再使用\n。这是因为fgets\n 保留在输入字符串中的文件中。

【讨论】:

  • 请注意 status1status2 现在是 char * 而不是 int 变量。在调用printf() 之前检查statusstatus2 的值也很好。如果其中一个返回NULLprintf() 将显示相应输入文件的上一个循环迭代的结果。如果一行比sizeof(input) 长,会发生什么?
  • 您也不需要 !=NULL 检查。布尔表达式不是 C 中的一等公民。因此 Null 在 C 中意味着 false。
  • @JohnDemetriou - 感谢您的关注。我错过了第一次编辑的 NULL 检查。
  • @AndrewHenle 我正在考虑编辑它,但后来我想也许作者和编辑可能不想这样做,因为并不总是知道 null 意味着假,而 !null 对某些人来说是真的,它会对于一些未来的读者来说是一个更简单的答案,包括写这个问题的人(根据他自己的说法)是 C 中的菜鸟 :)
  • 每行打印两次。
【解决方案2】:

我对代码进行了更改并且它可以工作,但是另一个问题。如果我想比较文件并将差异写到一个新文件中,如下所示:

  1. 文件1:我叫克努特
  2. 文件 2:我的名字是 KnutAndre
  3. File3:Andre(这是文件之间的区别)。

我的老师告诉我使用 strcmp 然后将输出放入一个新文件中,但我不太了解他.. 有没有人可以尝试一些技巧?

到目前为止,这是我的代码的样子:

int main()
{

FILE *infile;
FILE *infile2;
FILE *outfile3;
char input[255],input2[255];
char status1, status2;



infile = fopen("test.txt", "r");
infile2 = fopen("test2.txt", "r");

if(infile == NULL)
{
    printf("Can not open file 1!\n");
}
else if(infile2 == NULL)
{
    printf("Can not open file 2!\n");
}
else
{
    do
    {
        status1 = fgets(input, sizeof(input), infile);
        status2 = fgets(input2, sizeof(input2), infile2);

        if(status1 != 0){

        printf("File 1: %s\n\nFile 2: %s\n\n", input, input2);

        int result = strcmp(input, input2);
        printf("\nResult = %d\n\n", result);

        }


    }
    while(status1 || status2);

}
fclose(infile);
fclose(infile2);

return 0;



}

【讨论】:

  • 一个不同的问题意味着打开一个不同的问题,我的朋友。这不是一个论坛。这是一个问答网站。你问一些有意义的事情,人们会回答,如果你有其他问题,你再问一次。除非你的问题质量不好等
【解决方案3】:

当您使用fscanf 时,它只会读取字符,直到出现非空白字符。当您需要将输入作为整行时,您必须使用fgets()

来自fgets()man页面。

fgets() 从流中最多读入一个小于 size 的字符,并将它们存储到 s 指向的缓冲区中。阅读停止后 EOF 或换行符。如果读取了换行符,则将其存储到缓冲区中。在最后一个字符之后存储终止空字节 ('\0') 在缓冲区中。

所以你必须这样使用。

  fgets(input,255,infile);
  fgets(input2,255,infile2);

在检查条件时,

while(input != NULL || input2 != NULL);

【讨论】:

    【解决方案4】:

    在我的学校,我们创建了一个 get_next_line 函数,它接受一个文件描述符和一个指向参数中的字符串的指针。

    你可以看这里:https://github.com/juschaef/libtowel/search?utf8=%E2%9C%93&q=get+next+line

    【讨论】:

    猜你喜欢
    • 2013-08-15
    • 2022-11-24
    • 2021-09-11
    • 2012-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多