繁体   English   中英

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

[英]Reading char by char from an input file in C?

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

  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语句中,它将采用第一个字母,然后崩溃。

那么这是什么问题呢?

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

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

这就像在C#中创建一个固定的数组,然后尝试将其追加。 该语言不允许您这样做,因为这将涉及覆盖数组结束后发生的任何其他内存。 C会让您尝试,但随后崩溃,因为您正在乱写自己不拥有的内存,或者更糟糕的是,让您这样做,然后继续在未知状态下运行。 谁知道还有什么是从的地址找到了几个字节沿着line 你不知道

有关更多信息,请参见此问题: 字符串文字:它们在哪里?

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

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

编辑我意识到那linechar[]而不是char* ,所以编辑了我的答案。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM