在C中读取一行到char数组

我正在尝试读取C中的文件,该文件具有以下形式的IP地址列表.

1 121.20.35.8 5634
2 179.105.43.24 2345
3 122.45.36.102 5096
4 28.105.63.41 8081
5 128.20.6.250 1864

我正在尝试将IP地址写入相关索引.虽然相关指数可能不合适.同样,这种类型的文件是完全可能的.

 3 122.45.36.102 5096
 1 121.20.35.8 5634
 4 28.105.63.41 8081
 2 179.105.43.24 2345
 5 128.20.6.250 1864

我已经分配了一个数组来保存地址

    char** servers = malloc(sizeof(char*)*10);
    for (int i = 0; i < 10; ++i)
    {
        servers[i] = malloc(sizeof(char)*(MAX_IP + 1));
    }

并使用此代码读取文件. MAX_IP这里是255.255.255.255的strlen

   static const char filename[] = "file.txt";
   FILE *file = fopen ( filename, "r" );
   char line [MAX_IP + 10];
   while ( fgets ( line, sizeof line, file ) != NULL ) /* read a line */
    {
       //split the line into index and IP address and store the IP   address in the relevant index
    }
      fclose ( file );

所以现在我想以一种方式读取文件,将行拆分为索引和IP地址,并将IP地址存储在相关索引中.需要一些帮助,以最有效的方式来解决它.

最佳答案

while ( fgets ( line, sizeof line, file ) != NULL )
{ int idx, port; char ip[MAX_IP + 1];
  sscanf(line, " %d %s %d", &idx, ip, &port);
  strncpy(servers[idx-1], ip, MAX_IP + 1);
}

但是,当然,如果您不确定输入文件的正确性,则应添加错误检查.

编辑:既然你要求“有效的方式”,你可以一步完成阅读,而不是阅读一行,然后解析它.你也可以这样做:

int idx, port; char ip[MAX_IP + 1];
while (3 == fscanf(file, " %d %s %d", &idx, ip, &port))
   memcpy(servers[idx-1], ip, MAX_IP + 1);

请注意,memcpy比strcpy快,除非源字符串远小于缓冲区的大小,这与ip addesses的情况很少见……

点赞