当前位置: 代码迷 >> C语言 >> [求助]怎么老读取错误啊!
  详细解决方案

[求助]怎么老读取错误啊!

热度:91   发布时间:2007-11-04 10:24:23.0
[求助]怎么老读取错误啊!

写了个程序想实现下文件的读取,可是发现个问题
没法正确读取第一个数,一定要开头空一格。。。。。。。
否则就是不读第一个。。。郁闷,而且读出来的总数也有问题。。。比实际多一个
我觉得就这个TEST读出来,I应该是10。。。但是怎么是11呢

程序如下,文件我也带上吧,N人出来帮忙啊!
#include <stdio.h>
#include <stdlib.h>
void main()
{
FILE * fp;
int ch;
int a[20]={0};
int i=0;
int j;
if((fp=fopen("E:\\turbo-c\\Work\\test.txt","r"))==NULL)
{
printf ("cannot open file\n");
exit(0);
}

while (ch!=EOF)
{
ch=fgetc(fp);
fscanf(fp,"%d",&a[i]);
i++;
}
fclose(fp);
printf("%d\n\n\n",i);
printf("%d\n\n\n",a[0]);
for(j=0;j<i;j++)
printf("%d\n",a[j]);

getch();
}


[此贴子已经被作者于2007-11-4 10:27:48编辑过]


----------------解决方案--------------------------------------------------------

while (ch!=EOF)
{
ch=fgetc(fp); // fgetc 吃掉了一个字符
fscanf(fp,"%d",&a[i]);
i++;
}

这就是需要开头空格的原因。


/* 修改后的原代码 */

#include <stdio.h>
#include <stdlib.h>
void main()
{
FILE * fp;
int ch;
int a[20]={0};
int i=0;
int j;
int temp;

if((fp=fopen("E:\\turbo-c\\Work\\test.txt","r"))==NULL)
{
printf ("cannot open file\n");
exit(0);
}


while(fscanf(fp,"%d",&temp) == 1 && i < 20)
{
a[i] = temp;
i++;
}

fclose(fp);
printf("%d\n\n\n",i);

for(j= 0; j < i; j++)
printf("%d\n",a[j]);

getch();
}


/* fscanf() 返回成功读取的项目的个数,也返回文件结为。*/



[此贴子已经被作者于2007-11-4 11:50:46编辑过]


----------------解决方案--------------------------------------------------------
以下是引用cosdos在2007-11-4 11:32:40的发言:

while (ch!=EOF)
{
ch=fgetc(fp); // fgetc 吃掉了一个字符
fscanf(fp,"%d",&a[i]);
i++;
}

这就是需要开头空格的原因。


/* 修改后的原代码 */

#include <stdio.h>
#include <stdlib.h>
void main()
{
FILE * fp;
int ch;
int a[20]={0};
int i=0;
int j;
int temp;

if((fp=fopen("E:\\turbo-c\\Work\\test.txt","r"))==NULL)
{
printf ("cannot open file\n");
exit(0);
}


while(fscanf(fp,"%d",&temp) == 1 && i < 20)
{
a[i] = temp;
i++;
}

fclose(fp);
printf("%d\n\n\n",i);

for(j= 0; j < i; j++)
printf("%d\n",a[j]);

getch();
}


/* fscanf() 返回成功读取的项目的个数,也返回文件结为。*/





原来是这样啊~~谢谢!

那样不是如果把两个语句换过来以后就OK了。。。

[此贴子已经被作者于2007-11-4 22:03:38编辑过]


----------------解决方案--------------------------------------------------------
。。。。那样换了貌似OK。。。。


对了为什么你这样编写以后把空格换成逗号就不好用了
而我原来逗号和空格隔开都好用呢?

[此贴子已经被作者于2007-11-4 22:13:17编辑过]


----------------解决方案--------------------------------------------------------
以下是引用fctc007在2007-11-4 22:05:37的发言:
。。。。那样换了貌似OK。。。。


对了为什么你这样编写以后把空格换成逗号就不好用了
而我原来逗号和空格隔开都好用呢?

因为你使用 getc() 函数,scanf() 函数过滤掉了文本中的空格,同屏幕上输入一样。


如果要使用逗号隔开,那代码可以改。

while((j = fscanf(fp,"%d",&temp)) != EOF && i < 20)
{
if(j) /* 这样改后会过滤掉所有的非数字字符(负数例外)*/
{
a[i] = temp;
i++;
}
else
getc(fp);
}

[此贴子已经被作者于2007-11-5 1:03:22编辑过]


----------------解决方案--------------------------------------------------------
  相关解决方案