编写文件单词首字母大写的C程序出错,求排查及API疑问
关于C文件操作中fgetc用法错误及fscanf光标移动的问题解答
嘿,我来帮你拆解代码里的问题,还有你关心的fscanf光标移动的疑问:
一、你的代码里fgetc的用法确实有误,核心错误和其他问题如下:
1. 最致命的运算符优先级问题
你写的循环条件:
while(ch[i]=fgetc(fp)!=EOF)
这里犯了一个经典的运算符优先级错误:!=的优先级比=高,所以这行代码会先判断fgetc(fp) != EOF,得到一个0(假)或1(真)的布尔值,然后把这个值赋值给ch[i]——这完全不是你想要的!你实际想做的是先把fgetc读取的字符存到ch[i],再判断这个字符是不是EOF。
正确写法必须给赋值表达式加括号,强制改变优先级:
while( (ch[i] = fgetc(fp)) != EOF )
2. 其他和fgetc相关的逻辑漏洞
除了上面的优先级问题,代码里还有几个和文件读写相关的错误:
- 你在还没读取任何字符的时候,就直接执行
ch[0] = ch[0] - 32,这时候ch[0]是未初始化的垃圾值,完全没有意义。 - 混合使用
fgetc和fseek的逻辑混乱:每次用fgetc读取一个字符后,你又调用fseek(fp,1,SEEK_CUR),这相当于额外跳过了一个字符,会导致大量内容被漏读。 - 修改字符后用
fprintf写入时,文件位置指示器没有回到正确的位置,会导致写入的内容覆盖错误的区域,直接破坏文件结构。
二、关于fscanf是否移动文件光标
答案是肯定的:fscanf会自动移动文件位置指示器(也就是你说的"光标")。每次fscanf成功读取数据后,光标会跳到下一个未被读取的字节位置。比如你用fscanf(fp, "%s", buf)读取一个单词后,光标会停在这个单词后面的第一个字符(可能是空格、换行或者其他字符)的位置。
内容的提问来源于stack exchange,提问作者cilvegozu
相关产品推荐
相关产品推荐

