关于C语言fprinf的一个问题

题目

​ 从键盘输入一个字符文件名,以及一个英文字符串,将该文件中的该英文字符串中的小写英文字母变成大写。

​ 示例:字符文件内容如下:

We are students. All the students study very hard.

So, these students are outstanding students.

​ 输入的字符串为students

​ 则程序运行结束后,文件内容变为:

We are STUDENTS. All the STUDENTS study very hard.

So, these STUDENTS are outstanding STUDENTS.

​ 实验报告中要求描述关键算法或(代码实现方案)以及关键存储结构。

问题部分

//源码放在最后,先贴一个出错位置的
//读取文件并查找替换匹配的字符
do {
    if (match(fp, str)){
        fprintf(fp, "%s", str);
        continue; //已经移位了
    }

    fgetc(fp); //让光标移位到下一个
} while (!feof(fp));

我的疑惑

​ 在我的理解里,首先这是r+模式可以在任意位置读写,那么调用函数进行写入的时候,它不应该是在光标后面写入然后覆盖吗,就像键盘的insert键一样。所以我的结果应该是正确的,可是为什么结果是下面这样的?

为什么会多一个s?为什么very和outstanding会少字符?我不理解了。难道fprintf不是我想的那样吗?

源码

#include <stdio.h>

int match(FILE *fp, char *str);

int main(){
    //获取输入
    char path[81]={0}, str[32]={0};
    int check;
    printf("请输入文件名:");
    check = scanf_s("%s", path, 81);
    if (check==0){
        printf("输入的文件名过长!\n");
        return 1;
    }
    printf("请输入英文字符串:");
    check = scanf_s("%s", str, 32);
    if (check==0){
        printf("输入的英文字符串过长!\n");
        return 1;
    }
    //统一将字符串str大写化
    char *c = str;
    while (*c != '\0')
    {
        if (*c>='a' && *c<='z')
            *c -= 32;
        c++;
    }
    

    //打开文件
    FILE *fp;
    if ((fp=fopen(path, "r+")) == NULL){
        printf("打开文件失败!\n");
        return 1;
    }

    //读取文件并查找替换匹配的字符
    do {
        if (match(fp, str)){
            fprintf(fp, "%s", str);
            continue; //已经移位了
        }

        fgetc(fp); //让光标移位到下一个
    } while (!feof(fp));
    
    fclose(fp);
    return 0;
}

int match(FILE *fp, char *str){
    int current = ftell(fp);
    char *q=str, p=fgetc(fp);
    int ret = -1; //默认-1用于判断是否被修改
    while (*q!='\0' && p!=EOF)
    {
        p = p>='a'&&p<='z' ? p-32 : p;
        if (*q != p) ret = 0; //在str或fp没结束就不匹配了
        q++;
        p = fgetc(fp);
    }
    if (*q=='\0' && ret==-1) ret = 1; //str结束前都是匹配的,所以匹配
    else ret = 0; //否则是前面已判断或fp结束,不全匹配
    //光标归位
    fseek(fp, current, SEEK_SET);
    return ret;
}

注:文件是d.txt,输入的字符串是students
关于文件模式:https://www.cnblogs.com/kangjianwei101/p/5220021.html

posted @ 2022-12-24 02:08  faf4r  阅读(61)  评论(0编辑  收藏  举报