【发布时间】:2013-01-18 07:27:20
【问题描述】:
我遇到了最奇怪的事情,但我不太确定为什么会这样。基本上我需要做的是使用 fgetc 逐字节获取简单 ASCII 文件的内容。奇怪的是它起作用了,但后来我又添加了几个字符,突然间它添加了一个不存在的换行符,并读取到文件末尾或其他内容。从字面上看,我所做的只是
do {
temp = (char*) checked_realloc (temp, n+1);
e = fgetc(get_next_byte_argument);
temp[n] = e;
if (e != EOF)
n++;
}
while (e != EOF);
然后检查一下,我只是打印了每个字符
temp_size = strlen(temp)-1;
for(debug_k = 0; debug_k < temp_size; debug_k++){
printf("%c", temp[debug_k]);
}
它会正确输出所有内容,只是它添加了一个不在文件中的额外换行符。在此之前,我有
temp_size = strlen(temp);
但随后它以某个未知字节(打印的乱码)结束。我尝试了 strlen(temp)-2 以防万一,它适用于那个特定的文件,但后来我在末尾添加了一个额外的“a”,它又坏了。
我真的很难过。我不知道它为什么这样做。
编辑:checked_realloc 只是 realloc 但通过快速检查以确保我没有内存不足。我意识到这不是最有效的方法,但我更担心为什么我似乎在神奇地读取额外的字节。
【问题讨论】:
-
为了使
strlen(temp)工作,文件内容后应该有一个终止NUL 字符。您没有显示添加此最终\0的代码 - 你有吗? -
如果checked_realloc()只是realloc,在尝试读取之前尝试初始化内存为0。
-
噢噢噢……呃。我完全忘记了这一点。谢谢!顺便说一句,由于最后一个字符是 EOF,NULL 应该替换它还是紧随其后?我可能会通过反复试验来弄清楚,但我不妨问问
-
@user1777900 将
EOF替换为 NULL。我编辑了我的答案来解决这个问题。 -
EOF不是字符 --EOF是当您到达文件末尾时 fgetc 返回的整数。