从文件填充数组

时间:2015-02-18 17:32:10

标签: c file-io strcat

我有一个文件,其中包含一组我希望存储在数组中的字符,并且想知道C&#39 {s} strcat()函数是否可以完成这项工作。

那么,以下是从文件中获取字符的有效方法吗?

FIlE *file = fopen(argv[1], "r");
char ch, *msg[];

while(1)
{
   if(feof(file))
   {
      break;
   }
   ch = fgetc(file);
   strcat(msg,ch);
}
printf("%s", msg);

如果我的文件example.txt包含12345,那么msg12345吗?

3 个答案:

答案 0 :(得分:2)

您没有为char数组分配空间,而且它的类型与strcat()的第一个参数不兼容,您还需要nul终止数组,因此它是一个有效的字符串,所以

  1. Redeclare msg
  2. 为字符串分配空间。
  3. nul终止数组。
  4. fgetc()返回int而不是char
  5. 在这种情况下,你真的不需要使用break,而且几乎不需要。
  6. 您也不需要strcat()
  7. 检查fopen()是否未返回NULL
  8. 这就是你应该这样做的方式

    int  ch, count;
    char msg[100];
    FIlE *file = fopen(argv[1], "r");
    if (file == NULL)
        return -1;
    
    count = 0
    while (((ch = fgetc(file)) != EOF) && (count < sizeof(msg) - 1))
       msg[count++] = (char)ch;
    msg[count] = '\0';
    printf("%s", msg);
    

    另请注意

    while (1)
    {
        if (condition)
            break;
    }
    

    真的是

    while (condition)
    {
    }
    

    但有一个额外的风险,你可以在评估之前更改condition,并使代码很难理解。

答案 1 :(得分:2)

你应该只使用fgets()。但是要小心,你需要知道你正在读入的数组的大小 - 否则你最终可能会遇到一些讨厌的BufferOverflow错误。

char msg[100];

FIlE *file = fopen(argv[1], "r");
if (file == NULL)
    return -1;

if( fgets (msg, 100, file)!=NULL ) {
      printf ("%s\n", msg);
}
fclose(fp);

更好的方法是找到您正在读取的文件的大小,使用具有该大小的malloc动态分配msg数组,然后从文件中读取许多字符(而不是像100这样的硬编码值)。

答案 2 :(得分:0)

Strcat可能不是您想要使用的。它假定您要附加的字符串为空终止,您不保证。此外,此代码将失败,因为您没有为msg分配任何空间。另外我有点怀疑msg是使用[]指针的指针。我建议看看fgets功能的例子,而不是你正在做的事情。