HQWQF 发表于 2022-3-13 00:38:15

请教一个C语言文件操作的问题

int main()
{
    FILE* fp;
    errno_t error;
    char ch;
    char temp = {};
    int i = 0;
    int usernb = 0;
    char name[] = "asd";
    error = fopen_s(&fp, "UserData.txt", "r+");
    fflush(stdin);
    if (fp == NULL)
    {
      return 1;
    }
    fflush(stdin);
    while ((ch = fgetc(fp)) != EOF)//////统计用户数
    {
      if (ch == '#')
      {
            usernb++;
      }
    }
    fflush(stdin);
    rewind(fp);
    for (int j = 0; j < usernb; j++)
    {
      ch = fgetc(fp);
      while (ch != ';')
      {
            temp = ch;
            i++;
            ch = fgetc(fp);
      }
      temp = '\0';
      if (strcmp(temp, name) == 0)
      {
            ch = fgetc(fp);
            while (ch != ';')
            {
                ch = fgetc(fp);
            }
            ch = fgetc(fp);
            while (ch != ';')
            {
                ch = fgetc(fp);
            }
            ch = fgetc(fp);
            while (ch != ';')
            {
                if ((ch - 48) == 3)
                {

                  
                  fseek(fp, -2, SEEK_CUR);
                  fputs("", fp);
                  
                }
                ch = fgetc(fp);
            }
            //fprintf(fp, ";");
            fclose(fp);
            return 1;
      }
      while (ch != '\n')
      {
            ch = fgetc(fp);
      }
    }
    fclose(fp);
    return 0;

}

写的一个选课系统读取更改文件的代码,运行前文件是这样的:
asd;asd;mylove;1+2+3+4;               2;7;#

运行后文件是这样的:
asd;asd;mylove;1+2d;;               2;7;#

似乎多了个d;    经过我的实验,更改fputs("", fp);里” “中的空格数为一个空格,文件会变成这样:
asd;asd;mylove;1+2 sd;;               2;7;#
经过继续实验,发现多出来的字符和 asd; 相关,这刚刚好是程序之前出现过的字符{:10_266:}
如果我把name变量和文件开头改为 123; 发现多出来的字符又和 123; 相关,我考虑是不是缓冲区的问题,在一些地方添加了fflush(stdin);但是没有用(可能没加在正确的位置?)
救救我{:10_254:}

人造人 发表于 2022-3-13 00:58:58

运行后文件是什么样的才正确?

HQWQF 发表于 2022-3-13 08:48:33

人造人 发表于 2022-3-13 00:58
运行后文件是什么样的才正确?

asd;asd;mylove;1+2+4;               2;7;#
大概这样

jhq999 发表于 2022-3-13 09:18:30

HQWQF 发表于 2022-3-13 08:48
大概这样

                                        fseek(fp,-2, SEEK_CUR);
                                        fputs("", fp);
                                        fseek(fp,2, SEEK_CUR);

HQWQF 发表于 2022-3-13 09:49:42

jhq999 发表于 2022-3-13 09:18


非常感谢,这样就好了{:10_266:}
方不方便稍微讲一下为什么缺一行fseek不行呢

jhq999 发表于 2022-3-13 12:11:34

HQWQF 发表于 2022-3-13 09:49
非常感谢,这样就好了
方不方便稍微讲一下为什么缺一行fseek不行呢

大概需要刷新一下吧{:5_93:}
反正我处理文件时很少r+;都是读入内存,然后处理内存数据,再重新写入
页: [1]
查看完整版本: 请教一个C语言文件操作的问题