我正在尝试读取一个文件并用ASCII表中相应的char up替换每个char . 它会正确打开文件,但继续阅读第一个字符 .
int main(int argc, char * argv[])
{
FILE *input;
input = fopen(argv[2], "r+");
if (!input)
{
fprintf(stderr, "Unable to open file %s", argv[2]);
return -1;
}
char ch;
fpos_t * pos;
while( (ch = fgetc(input)) != EOF)
{
printf("%c\n",ch);
fgetpos (input, pos);
fsetpos(input, pos-1);
fputc(ch+1, input);
}
fclose(input);
return 1;
}
文本文件是
abc
def
ghi
我很确定这是由于fgetpos和fsetpos,但是如果我将其删除,那么它将在文件的末尾添加字符,下一个fgetc将返回EOF并退出 .
5 回答
procedure for performing random access such
定位了记录
读取记录
定位了记录
更新(写)记录
执行刷新(以完成更新)
以下代码是考虑它的重写 .
处理在更新模式下打开的文件时必须小心 .
所以你的阅读可能看起来像:
顺便说一句,你会遇到
'z'
字符的问题 .我真的怀疑问题在这里:
你正在声明一个指向
fpos_t
的指针,这很好,但是当你检索pos时,存储的信息在哪里?它应该是:
阅读(草案)标准,
fpos_t
的唯一要求是能够代表FILE
的位置和状态,似乎没有办法移动位置 .注意表达式
pos+1
移动指针,不影响它指向的值!你可能想要的是旧的,亲爱的
ftell()
和fseek()
,它可以让你四处走动 . 只需记住在fputc()
之后用"rb+"
和flush()
打开文件 .如果您已经解决了这个基本问题,您会注意到您的方法存在另一个问题:处理换行符!你很可能应该限制你将应用"increment"的字符范围,并规定
a
跟随z
和A
跟随Z
.那就是说,是否需要就地进行?
7.21.9.1p2
未明确的信息似乎并没有激发对减法的信心 . 您是否考虑在阅读角色之前调用
fgetpos
,这样您就不必进行非便携式减法?此外,您对fgetpos
的调用可能应该传递指向现有fpos_t
的指针(例如,使用&address-of
运算符) . 您的代码当前传递指向乱码的指针 .fgetc
返回int
,以便它可以表示与负EOF
值不同的每个可能的unsigned char
值 .假设您的
char
默认为无符号类型 .(ch = fgetc(input))
将(可能为负,对应于错误)返回值直接转换为无符号char
类型 .(unsigned char) EOF
能否等于EOF
?你的循环什么时候结束?假设您的
char
默认为signed type
.(c = fgetc(input))
可能会将任何返回的unsigned char
值的较高范围转换为负数(但从技术上讲,此语句会调用未定义的行为) . 在某些情况下,你的循环不会过早结束(例如在EOF之前)吗?这两个问题的答案都表明您正在错误地处理
fgetc
的返回值 . Store it in an int!也许您的循环应该类似于:
确保检查返回值...
更新模式('')处理起来有点棘手 . 也许你可以改变方法并将整个文件加载到char数组中,迭代它然后最终将整个文件写入清空的输入文件中?没有流问题 .