鱼C论坛

 找回密码
 立即注册
查看: 1101|回复: 5

[已解决]请教一个C语言文件操作的问题

[复制链接]
发表于 2022-3-13 00:38:15 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. int main()
  2. {
  3.     FILE* fp;
  4.     errno_t error;
  5.     char ch;
  6.     char temp[32] = {};
  7.     int i = 0;
  8.     int usernb = 0;
  9.     char name[] = "asd";
  10.     error = fopen_s(&fp, "UserData.txt", "r+");
  11.     fflush(stdin);
  12.     if (fp == NULL)
  13.     {
  14.         return 1;
  15.     }
  16.     fflush(stdin);
  17.     while ((ch = fgetc(fp)) != EOF)//////统计用户数
  18.     {
  19.         if (ch == '#')
  20.         {
  21.             usernb++;
  22.         }
  23.     }
  24.     fflush(stdin);
  25.     rewind(fp);
  26.     for (int j = 0; j < usernb; j++)
  27.     {
  28.         ch = fgetc(fp);
  29.         while (ch != ';')
  30.         {
  31.             temp[i] = ch;
  32.             i++;
  33.             ch = fgetc(fp);
  34.         }
  35.         temp[i] = '\0';
  36.         if (strcmp(temp, name) == 0)
  37.         {
  38.             ch = fgetc(fp);
  39.             while (ch != ';')
  40.             {
  41.                 ch = fgetc(fp);
  42.             }
  43.             ch = fgetc(fp);
  44.             while (ch != ';')
  45.             {
  46.                 ch = fgetc(fp);
  47.             }
  48.             ch = fgetc(fp);
  49.             while (ch != ';')
  50.             {
  51.                 if ((ch - 48) == 3)
  52.                 {

  53.                     
  54.                     fseek(fp, -2, SEEK_CUR);
  55.                     fputs("  ", fp);
  56.                     
  57.                 }
  58.                 ch = fgetc(fp);
  59.             }
  60.             //fprintf(fp, ";");
  61.             fclose(fp);
  62.             return 1;
  63.         }
  64.         while (ch != '\n')
  65.         {
  66.             ch = fgetc(fp);
  67.         }
  68.     }
  69.     fclose(fp);
  70.     return 0;

  71. }
复制代码

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

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

似乎多了个d;    经过我的实验,更改fputs("  ", fp);里” “中的空格数为一个空格,文件会变成这样:
asd;asd;mylove;1+2 sd;;               2;7;#

经过继续实验,发现多出来的字符和 asd; 相关,这刚刚好是程序之前出现过的字符
如果我把name变量和文件开头改为 123; 发现多出来的字符又和 123; 相关,我考虑是不是缓冲区的问题,在一些地方添加了fflush(stdin);但是没有用(可能没加在正确的位置?)
救救我
最佳答案
2022-3-13 09:18:30
  1.                                         fseek(fp,-2, SEEK_CUR);
  2.                                         fputs("  ", fp);
  3.                                         fseek(fp,2, SEEK_CUR);
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-3-13 00:58:58 | 显示全部楼层
运行后文件是什么样的才正确?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-3-13 08:48:33 | 显示全部楼层
人造人 发表于 2022-3-13 00:58
运行后文件是什么样的才正确?
asd;asd;mylove;1+2  +4;               2;7;#

大概这样
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-3-13 09:18:30 | 显示全部楼层    本楼为最佳答案   
  1.                                         fseek(fp,-2, SEEK_CUR);
  2.                                         fputs("  ", fp);
  3.                                         fseek(fp,2, SEEK_CUR);
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-3-13 09:49:42 | 显示全部楼层

非常感谢,这样就好了
方不方便稍微讲一下为什么缺一行fseek不行呢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-3-13 12:11:34 | 显示全部楼层
HQWQF 发表于 2022-3-13 09:49
非常感谢,这样就好了
方不方便稍微讲一下为什么缺一行fseek不行呢

大概需要刷新一下吧
反正我处理文件时很少r+;都是读入内存,然后处理内存数据,再重新写入
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-24 18:39

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表