从C中的输入文件中读取char字符?

时间:2013-09-26 13:35:50

标签: c strcat

我正在尝试读取一个文件,然后读取每个字符,直到我到达一个新行,在该行上做一些工作。以下是我到目前为止所做的事情:

  char line[] = "";
  char *charcter = "";

  //If i do this here it works fine, but below it's not working at all
  charcter = "asssss";
  strcat(line,charcter);

  //Read file
  inputFile = fopen(fileName,"r");
  if (inputFile) 
  {
    while ((charcter = (char)getc(inputFile)) != EOF)
           strcat(line,charcter); //This piece code keeps crashing my program on run

    fclose(inputFile);
  }

我是一名C#开发人员,我真的很沮丧,我无法理解这件事,请帮忙。

编辑:

我修改了分段线,并为此分配了内存:

char *line = (char*)malloc( 400 *sizeof(char));

现在while循环中的strcat工作但是在获取所有值后崩溃(输入远小于分配的内存),如果我将相同的strcat语句放在if语句中,它将占用第一个字母然后崩溃。

那么这里有什么问题?

2 个答案:

答案 0 :(得分:2)

您正在尝试修改堆栈中数组中的字符串。您将line[]分配为""(即一个字节,null字符),然后尝试使用strcat对内存进行涂鸦(这将修改其指向的内存)第一个论点)。

当您将字符串放入源文本并将其分配给函数中的数组变量时,会在函数的调用帧中为堆栈分配大量内存。如果你在它之后访问内存,你就会在堆栈的其他位上乱写,这不仅可以修改数据,还可以修改程序的行为。

这就像在C#中创建一个固定数组,然后尝试追加它。语言不允许你这样做,因为这将涉及写入在数组结束后发生的任何其他内存。 C会让你尝试,但随后崩溃,因为你在你不拥有的内存上涂鸦,或者更糟糕的是,让你这样做,然后继续在未知状态下运行。谁知道从line的地址发现了几个字节?你没有。

有关详细信息,请参阅此问题:String literals: Where do they go?

一旦你有一个指向内存地址的指针,C只知道它是一个指针。它不知道它指向什么样的内存(静态常量,堆栈,堆),所以它会让你犯这个错误。如果你犯了错误,操作系统可能会通过引发分段错误来说“实际上不是,这是不允许的”,或者如果它是一个更微妙的错误则可能不会。

您应该使用malloc分配一个大缓冲区,足以容纳文件(危险)或重新分配缓冲区以便每次扩展它。

编辑我意识到linechar[]而不是char*,因此编辑了我的回答。

答案 1 :(得分:1)

  • 你不能strcat()一个角色 - 你需要一个字符串
  • 字符变量的类型应为int(检查getc()的原型)
  • 如果您仍想逐个字符地进行,请考虑按索引将其添加到字符串中(并在结尾处终止NUL)