关于fgetc和fputc连续使用的问题

#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);就是将指针重新进行定位,但是仍然是当前位置

写之后读 同理

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值