【发布时间】:2020-09-18 00:44:51
【问题描述】:
有这个:
int main (void) {
FILE *fp = fopen("txt2", "r+");
rewind(fp);
fprintf(fp, "ab");
fseek(fp,1L,SEEK_CUR); //trying to change offset to 1,2,3,...
fprintf(fp, "cd");
rewind(fp);
for(int c;(c=getc(fp))!=EOF;)
putchar(c);
fclose(fp);
return 0;
}
我想知道,如果fseek 从当前位置向前偏移了空格或一些垃圾。我会在应该是空格的地方给出^ 的输出。
fseek(fp,0L,SEEK_CUR)
-> abcd //yes, that is what I expect
fseek(fp,1L,SEEK_CUR)
-> abccd //not space -> 'c' char instead
^
fseek(fp,2L,SEEK_CUR)
-> abcdcd //'cd' are in addition (random chars?)
^^
fseek(fp,3L,SEEK_CUR)
-> abcdccd //'cdc' no it is probably not "random", they repeat
^^^
fseek(fp,100000000000L,SEEK_CUR)
-> abcdcdcdcdcdcdcdcdcd
fseek(fp,1000000000000000000000000L,SEEK_CUR0
->warning: integer constant is too large for its type
fseek(fp,1000000000000000000000000L,SEEK_CUR);
fseek 移动是怎么回事?它们是制作“移动字符”的图案?在这种情况下根据下一个printf 字符? (cd)。我不太了解这种行为以及如何使用 fseek 移动空格?我只知道在每次写入之前和之后使用 rewind 以执行正确的读取(在 for 循环中),但这并不能解释这种行为。谁能给个提示?
【问题讨论】:
-
您正在寻找文件末尾,这会留下一个“洞”,并且您希望库使用空格字符来填充该洞:是什么让您认为应该这样做?我从未将其视为图书馆合同的一部分,因此它可能会获取您刚刚寻找过去的缓冲区中的任何垃圾。我几乎可以肯定这里没有明确的行为。
-
以
r+开头和fprintf()调用表明您要读写txt2; 2fprintf()解释ab和cd字节。如果不是有意的,请切换到使用r打开并且不要输出到fp。要了解有关空间的问题,发布输入文件会有所帮助。 -
@SteveFriedl 那么如何在文件末尾创建“空间”,以便我可以在文件末尾移动并写入? (这是帖子的意图)
-
@autistic456 我不确定我是否完全明白这个问题 - 如果你想移动到文件的末尾,那么你可以使用偏移量为 0 的
SEEK_END标记。