如何在C中逐行读取文件?

Tyl*_*eat 1 c arrays file fgets

我有一个文本文件,最多100个IP地址,每行1个.我需要将每个地址作为字符串读入名为"list"的数组中.首先,我假设"list"需要是一个二维char数组.每个IP地址长度为11个字符,如果包含"\ 0"则为12个,因此我声明列表如下:

char list[100][12];

接下来,我尝试使用fgets来读取流:

  for (i = 0; i < 100; i++)  
  {  
      if (feof(stream))  
          break;  
          for (j = 0; j < 12; j++)  
          fgets(&list[i][j], 12, stream);  
      count++;  
  }
Run Code Online (Sandbox Code Playgroud)

要检查字符串是否已正确读取,我尝试输出它们:

  for (i = 0; i < 5; i++)  
  {  
      for (j = 0; j < 11; j++)  
          printf("%c", list[i][j]);  
      printf("\n");  
  }
Run Code Online (Sandbox Code Playgroud)

运行程序后,很明显出错了.作为初学者,我不确定是什么,但我猜我正在读错文件.没有错误.它编译,但在两行打印一个奇怪的地址.

编辑:

我用这个替换了fgets代码:

for (i = 0; i < 100; i++)
  {
      if (feof(stream))
          break;
      fgets(list[i], 12, stream);
      count++;
  }
Run Code Online (Sandbox Code Playgroud)

它现在打印五个字符串,但它们是来自内存的"随机"字符.

Jer*_*fin 6

一,阅读:

      for (j = 0; j < 12; j++)  
      fgets(&list[i][j], 12, stream);  
Run Code Online (Sandbox Code Playgroud)

你这里有一个大问题.这是尝试将字符串读入数组中的每个连续字符.

总而言之,我认为你让它变得比它需要的复杂得多.将您的数组视为100个字符串,并且fgets一次使用一个字符串.这意味着阅读可能看起来像这样:

for (i=0; i<100 && fgets(list[i], 11, string); i++)
    ;
Run Code Online (Sandbox Code Playgroud)

还有另外一个小细节需要处理:fgets()通常在每行末尾保留换行符.因此,您可能需要留有余地13个字符(11地址,1新线,1 NUL终止),否则你可能需要将数据读入临时缓冲区,并将其复制到你的list后只你已经剥离了新线.

在您当前打印字符串的代码中,您一次只能处理一个字符,这可能会起作用,但这是不必要的困难.有几个人建议使用%s printf转换,这本身就很好.但是,要使用它,您必须简化索引.打印前六个地址看起来像这样:

for (i=0; i<6; i++)
    printf("%s", list[i]);
Run Code Online (Sandbox Code Playgroud)