C语言用fscanf 和 fprintf 函数读取文本数据问题!急急急!!! 30

我的程序是想实现以下功能:1、将数据写入system.txt文件;2、将数据从system.txt文件中读出到数组buff()中。程序代码:#include<stdio.... 我的程序是想实现以下功能:
1、将数据写入system.txt文件;
2、将数据从system.txt文件中读出到数组buff()中。

程序代码:
#include<stdio.h>
#include <time.h>
int main()
{
int data[5]={1932,4320,2831,3422,1344};
int buff[5]={};
int i, a, b, c, d, e ;

FILE *fp1 = fopen("system.txt", "w" ); //设置输入输出文件指针
for(i=0; i<5; i++ )
{
fprintf(fp1,"%d\n", data[i]);
}
fclose(fp1);

FILE *fp2 = fopen("system.txt", "r" );
fscanf(fp1,"%d\n", &a);
fscanf(fp1,"%d\n", &b);
fscanf(fp1,"%d\n", &c);
fscanf(fp1,"%d\n", &d);
fscanf(fp1,"%d\n", &e);
fclose(fp2);

}

数据写入system.txt中没有问题,但是从system.txt读出数据时,a 有时能读到数据却有时读不到数据,很纳闷,小弟学C语言不久,望高手指点 !
展开
 我来答
冉易云ST
2011-12-01 · TA获得超过535个赞
知道小有建树答主
回答量:397
采纳率:0%
帮助的人:524万
展开全部
直接写到数组buff中:
#include<stdio.h>
#include <time.h>
int main()
{
int data[5 + 1]={1932,4320,2831,3422,1344};
int buff[5 + 1]={};
int i, a, b, c, d, e ;
int iFlag = 0;

FILE *fp1 = fopen("system.txt", "w+" ); //如果没有此文件则新建
if (fp1!=NULL)
{
for(i=0; i<5; i++ )
{
fprintf(fp1,"%d\n", data[i]);
}
}
fclose(fp1);

FILE *fp2 = fopen("system.txt", "r" );
if (fp2!=NULL)
{
for(i=0; i<5; i++ )
{
fscanf(fp2,"%d\n", &buff[i]);
printf("%d\n",buff[i]);
}
}
fclose(fp2);
//fscanf(fp2,"%d\n", &a);
//fscanf(fp2,"%d\n", &b);
//fscanf(fp2,"%d\n", &c);
//fscanf(fp2,"%d\n", &d);
//fscanf(fp2,"%d\n", &e);

}
追问
data、buf为什么要5+1?
你这个写法和我写的有什么不同吗?能从原理解释一下吗?
追答
呵呵,个人习惯,一般定义数组大小的时候都会在原来大小的基础上+1(防止数据溢出),因数据存储时一般会带"\0"结束符的,此字符一般也会占一个字节的。举个例子来说:数据库建表的时候,数据库本身在为某字段申请空间的时候其大小为 原字段长度+1 的空间。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
furious_tauren
2011-11-30 · TA获得超过4055个赞
知道大有可为答主
回答量:1913
采纳率:100%
帮助的人:767万
展开全部
fscanf(fp1,"%d\n", &a); 把fp1改成fp2,下面的也是。另外我给重写了一个,你可以参考:

#include<stdio.h>
//#include <time.h>

int main()
{
int data[5]={1932,4320,2831,3422,1344};
int buff[5]={};
int i;
// a, b, c, d, e ;
FILE *fp1, *fp2;

fp1 = fopen("system.txt", "w" ); //设置输入输出文件指针
for(i=0; i<5; i++ )
{
fprintf(fp1,"%d\n", data[i]);
}
fclose(fp1);

fp2 = fopen("system.txt", "r" );
for(i=0; i<5; i++ )
{
fscanf(fp2,"%d\n", &buff[i]);
}
fclose(fp2);

for(i=0; i<5; i++ )
printf("%d\n", buff[i]);
return 0;
}
追问
不好意思呀,“fscanf(fp1,"%d\n", &a);  把fp1改成fp2 的”这里面是我提问题写错了!真是抱歉!唔,你写的和我应该没有太大的差别,我想问一下,fscanf是怎样工作的?是不是每操作一次,文件指针就会往下移一下吗?但我没看到有任何与文件指针相关的操作呀!同时,发现fscanf格式都是一样,只是变量不一样而已,所以怎么知道变量取的是哪个值呀?
追答
比如你文件fp里的内容是 123   456  789
fscanf(fp,"%d", &buff[i]);
第一次读到的是123,把它存到buff[0]中, 然后文件指针自动跳到456 前面
第二次读到的是456,把它存到buff[1]中, 然后文件指针自动跳到789 前面
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
lijia7906288
2011-11-30 · TA获得超过127个赞
知道小有建树答主
回答量:137
采纳率:0%
帮助的人:99.6万
展开全部
fscanf(fp2,"%d\n", &a);
fscanf(fp2,"%d\n", &b);
fscanf(fp2,"%d\n", &c);
fscanf(fp2,"%d\n", &d);
fscanf(fp2,"%d\n", &e);
把fp1改为fp2
用的是VS2008调试
追问
呵。。对不起呀,我也是VS2008,我有同样的问题,已在楼上的一位写了追问,能帮我解释一下吗?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
忘至白葬不情必0T
2011-11-30 · TA获得超过3万个赞
知道大有可为答主
回答量:1.1万
采纳率:90%
帮助的人:1.2亿
展开全部
int buff[5]={};要改成int buff[5];

我试了几下,好像没问题。要不你把fscanf里面的"%d\n"都改成"%d"试试。
更多追问追答
追问
fscanf里面的"%d\n"都改成"%d" 我已经试过,同样出现问题,这问题出现的概率不是很高,只要出现问题那表示还是不行的,如果单步运行和全速运行有时是不一样的。你可以尝试多种测试方法,看看能不能出现我的问题,我在fscanf(fp1,"%d\n", &a);打个断点,然后单步运行,发现a有值,然后继续,当运行到c那句后,a没有值了,不知道为什么,这种情况有时候有,有时候没有,像漂浮不定似的!
追答
我试过了单步运行,没有问题,每次都能成功读取
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
adoqq_bd
2011-11-30 · TA获得超过7050个赞
知道大有可为答主
回答量:1818
采纳率:63%
帮助的人:1618万
展开全部
fscanf(fp1,"%d\n", &a);
fscanf(fp1,"%d\n", &b);
fscanf(fp1,"%d\n", &c);
fscanf(fp1,"%d\n", &d);
fscanf(fp1,"%d\n", &e);
估计是粗心了吧
把参数里的fp1换成fp2,因为fp1指向的空间已经被释放,a 有时能读到数据却有时读不到数据是因为用fp2打开文件时有可能恰好又分配在原来的空间
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(4)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式