用fgetc读取文件的末尾



我有最奇怪的事情发生,我不太确定为什么会发生。基本上,我需要做的是使用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,但快速检查以确保我没有内存不足。我意识到这不是最有效的方法,但我更担心的是为什么我似乎神奇地读取了额外的字节。

更安全的写法是:

    如果您在realloc之前分配内存,
  1. memset使用前的内存容量为零。每次realloc时,将其初始化为0。
  2. 如果你正在使用内存访问字符串或在该内存上使用字符串函数,请始终确保使用NULL字节终止该内存。

do{
    temp = (char*) checked_realloc (temp, n+1);//I guess you are starting n with 0? 
    temp[n]=0;
    e = fgetc(get_next_byte_argument);
    temp[n] = e;
    if (e != EOF)
        n++;
} while (e != EOF);
temp[n]=0;
n=0;

我想上面的代码变化应该解决你的问题。你不再需要strlen -1了。:)

欢呼。

听起来好像您忘记以空终止字符串。while后面加temp[n] = 0;

相关内容

  • 没有找到相关文章

最新更新