[英]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
分配一个大缓冲区,足以容纳该文件(危险),或者重新分配该缓冲区以每次扩展。
编辑我意识到那line
是char[]
而不是char*
,所以编辑了我的答案。
strcat()
一个字符-您需要一个字符串 int
(检查原型是否为getc()
)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.