#include <stdio.h>
#include <stdlib.h>
char fun1(char c) {
if (c >= 97 && c <= 122) {
c = c - 32;
}
return c;
}
int main() {
FILE* fp;
char c;
if ((fp = fopen("3.txt", "r+")) == NULL) {
printf("error");
exit(0);
}
while ((c = fgetc(fp)) != EOF) {
fputc(fun1(c), fp);
}
fclose(fp);
}
这是我朋友写的一段代码
她想实现文件里小写字母转大写的功能
但是这里存在问题
我知道肯定是fgetc和fputc都移动了指针,导致指针紊乱了
但是我想如果问题只是单纯的指针紊乱,那么结果应该是每隔一个,修改一个
但是运行的结果竟然是完全没有变化
(当文件中的字符数为奇数时,会死循环,因为fgetc永远读不到EOF,为偶数时会运行结束,但是没有效果)
经过调试我发现是fgetc之后的fputc失效了(只是写入效果没了,指针还是会往后挪一位)
但我并没有找到失效的原因,莫名其妙
于是我加了这句
我就想着每次读取一个字符之后,指针自动往后挪了
那我就把它往前挪一位,挪回来
这样下面的fputc就还是在这个位置写入修改后的字符,并且指针移动到下一个
可运行结果出乎我的意料
第一个和第二个字符都和预期的一样小写转大写
但是第三个字符开始一直往后,一直写入第二个字符的大写
如下:
经过调试我又发现
fputc之后的fgetc居然也失效了(还是莫名其妙)
这导致fgetc永远都是第二个字符,永远读不到EOF,所以死循环了
于是我又加了一句
这样重置一下指针
就能正常运作了
运行结果和预期相同
下面正式抛出我的问题:
希望大神能够在评论区留下自己的看法
谢谢!
二次更新
如果想读之后执行写的操作,就要对文件指针进行重新定位
比如fseek (fp, 0, SEEK_CUR);就是将指针重新进行定位,但是仍然是当前位置
写之后读 同理