鱼C论坛

 找回密码
 立即注册
查看: 1188|回复: 6

[已解决]文件读写问题

[复制链接]
发表于 2020-9-3 16:11:30 | 显示全部楼层 |阅读模式

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

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

x
代码想实现功能:整个代码块会在别的程序中被执行若干次,每次会在double文件中读入数据到a,b,c三个数组中,然后每次运行该代码会按顺序打印数组中的一组数据,文件中数据行数定义为size,当数组数据全打印后,再从a[0],b[0],c[0]开始打印,这里用手动运行代替程序执行代码
出现错误:运行时a[j],b[j],c[j]无内容,并且j.txt文件内容被清空
文件代码如下
  1. #include <stdio.h>

  2. int main()
  3. {
  4.         double              a[100];
  5.     double              b[100];
  6.     double              c[100];
  7.     int                 i=0;
  8.     int                 j;
  9.     int                 size;
  10.    
  11.     FILE                *fp;
  12.     FILE                *fq;
  13.    
  14. if((fp=fopen("D:\\OPNET14.5\\test\\double.txt","r")) == NULL)
  15.         {
  16.         puts("Can not open double.txt file!");
  17.         }
  18. else
  19. {
  20. do
  21. {
  22. fscanf(fp,"%lf ",&a[i]);
  23. fscanf(fp,"%lf ",&b[i]);
  24. fscanf(fp,"%lf\n",&c[i]);
  25. printf("%lf %lf %lf\n",a[i],b[i],c[i]);
  26. i++;
  27. }
  28. while(!feof(fp));
  29. size=i;
  30. }
  31. fclose(fp);

  32. if((fq=fopen("D:\\OPNET14.5\\test\\j.txt","w+")) == NULL)
  33.         {
  34.         puts("Can not open j.txt file!");
  35.         }
  36. else
  37.         {
  38.         fscanf(fq,"%d",&j);
  39.         }
  40.         printf("%lf %lf %lf\n",a[j],b[j],c[j]);
  41.        
  42. if(j < size-1)
  43.         {
  44.         j++;
  45. /* write down the value of j into the file */
  46.         fprintf(fq,"%d",j);
  47.         }
  48. else
  49.         {
  50.         j=0;
  51. /* write down the value of j into the file */
  52.         fprintf(fq,"%d",j);
  53.         }
  54. fclose(fq);

  55. return 0;
  56. }
复制代码


double.txt文件内容如下
1.000000e+000 2.000000e+000 -3.000000e+000
2.000000e+000 3.000000e+000 -2.000000e+000
3.000000e+000 4.000000e+000 -1.000000e+000
4.000000e+000 5.000000e+000 0.000000e+000
5.000000e+000 6.000000e+000 1.000000e+000
6.000000e+000 7.000000e+000 2.000000e+000
7.000000e+000 8.000000e+000 3.000000e+000
8.000000e+000 9.000000e+000 4.000000e+000
9.000000e+000 1.000000e+001 5.000000e+000
1.000000e+001 1.100000e+001 6.000000e+000
6.000000e+000 7.000000e+000 2.000000e+000
7.000000e+000 8.000000e+000 3.000000e+000
8.000000e+000 9.000000e+000 4.000000e+000
9.000000e+000 1.000000e+001 5.000000e+000
1.000000e+001 1.100000e+001 6.000000e+000

j.txt文件内容如下
0
最佳答案
2020-9-3 23:53:45
兄弟, 我刚刚试了你的程序,基本都没问题,最主要的问题就是你打开  j.txt 文件的方式有问题  w+ 的打开方式说明如下:

1. 以读和写的模式打开一个文本文件,从文件头开始读取和写入
2. 如果文件不存在则创建一个新的文件
3. 如果文件已存在则将文件的长度截断为 0(重新写入的内容将覆盖原有的所有内容)

你文件不存在创建新文件,文件存在,则会将长度截断为0,所以你以 w+ 打开文件的时候,文件里面永远是没内容的状态,当你用 r+ 模式打开 j.txt 的时候就没问题了
微信图片_20200903160746.png
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-9-3 23:53:45 | 显示全部楼层    本楼为最佳答案   
兄弟, 我刚刚试了你的程序,基本都没问题,最主要的问题就是你打开  j.txt 文件的方式有问题  w+ 的打开方式说明如下:

1. 以读和写的模式打开一个文本文件,从文件头开始读取和写入
2. 如果文件不存在则创建一个新的文件
3. 如果文件已存在则将文件的长度截断为 0(重新写入的内容将覆盖原有的所有内容)

你文件不存在创建新文件,文件存在,则会将长度截断为0,所以你以 w+ 打开文件的时候,文件里面永远是没内容的状态,当你用 r+ 模式打开 j.txt 的时候就没问题了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-9-4 00:14:18 | 显示全部楼层
我叫MD 发表于 2020-9-3 23:53
兄弟, 我刚刚试了你的程序,基本都没问题,最主要的问题就是你打开  j.txt 文件的方式有问题  w+ 的打开方 ...

太感谢了,那么我想读完对j进行改变的话就得先r+再fclose再加一个w+吗
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-4 01:11:20 | 显示全部楼层
JackLuu 发表于 2020-9-4 00:14
太感谢了,那么我想读完对j进行改变的话就得先r+再fclose再加一个w+吗

不用  当你 r+ 打开文件的时候,  也可以写文件的,所以直接写文件即可, 不用 w+ 了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-9-4 09:24:32 | 显示全部楼层
我叫MD 发表于 2020-9-4 01:11
不用  当你 r+ 打开文件的时候,  也可以写文件的,所以直接写文件即可, 不用 w+ 了

刚刚试了一下,r+的话会不断在后面加上新的数字,读第一次0的时候是正常的,再读一次01也是正常,后面就变成012读到12了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-4 10:21:48 | 显示全部楼层
JackLuu 发表于 2020-9-4 09:24
刚刚试了一下,r+的话会不断在后面加上新的数字,读第一次0的时候是正常的,再读一次01也是正常,后面就 ...

两种方法解决:
1.   每次r+写文件的时候,将文件指针移到开头的地方,从头写入,这样就不会往后追加了,但是有个问题
就是该模式不会将文件的长度截断为 0(只覆盖重新写入的内容,原有的内容保留)

2.  分2次进行,打开都的时候用 r 模式,然后当想写入的时候,关闭文件,重新用 w 模式打开,这样是完美
实现,且不会存在任何问题
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-9-5 20:04:59 | 显示全部楼层
我叫MD 发表于 2020-9-4 10:21
两种方法解决:
1.   每次r+写文件的时候,将文件指针移到开头的地方,从头写入,这样就不会往后追加了 ...

问题解决了,谢谢大佬
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-27 14:27

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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