C - 用fgetc读取文件末尾

时间:2013-01-18 07:27:21

标签: c file 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但快速检查以确保我没有内存不足。我意识到这不是最有效的方法,但我更担心为什么我似乎神奇地读取额外的字节。

2 个答案:

答案 0 :(得分:1)

编写此类操作的更安全的方法是:

  1. 在使用零之前记忆内存批量,如果你在realloc之前分配内存。每次重新分配时,将其初始化为零。
  2. 如果您使用内存访问字符串或在该内存上使用字符串函数,请始终确保使用NULL字节终止该内存。
  3. 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了。 :)

    干杯。

答案 1 :(得分:0)

听起来你忘了null终止你的字符串。在temp[n] = 0;之后添加while