C语言从文件中读取数据的问题

写一个c语言程序,其中必须包含下列代码:
float a,b;
int i,j;
char c1,c2,c3;
int Retcode;
Retcode=fscanf(stdin,"%o 2%ld %c 5%c %c %f %f",
&i,&j,&c1,&c2,&c3,&b,&a);
要从一个文件,Text2.in中读取数据
Text2.in的内容如下:
***77**243567\n
*2.4e3**14.7\n
172**\n
其中*号是空格,
要求得到i,j,c1,c2,c3,b,a,Retcode这几个变量的值?
我写的代码是:

This is a part of a program:
float a,b;
int i,j;
char c1,c2,c3;
int RetCode;
RetCode=fscanf(stdin," %o 2%ld %c 5%c %c %f %f ",&i,&j,&c1,&c2,&c3,&b,&a);

i need use this program to read some information from a file which named "Text2.in",
i am going to show you what's in the file "Text2.in"
***77**243567\n
*2.4e3 14.7\n
172**\n

i used * replace blank,in reality they are blanks

and the question is what's the value of Retcode,a,b,i,j,c1,c2,c3????

now i am going to show you my program

#include<stdio.h>
#include<stdlib.h>
int main(void)
{
float a,b;
int i,j;
char c1,c2,c3;
int Retcode;
FILE*fp;
stdin = fopen("Text2.in","r");
Retcode=fp(stdin,"%o 2%ld %c 5%c %c %f %f", &i,&j,&c1,&c2,&c3,&b,&a);
system("pause");
return 0;
}
不知道对不对,帮忙看一下.
值我运行完程序都知道了,大家也不用告诉我,只是不知道程序是怎么读的,希望可以解说一下?还有为什么Retcode的值为3?

我如果把代码改成这样的话:
#include<stdio.h>
#include<stdlib.h>
int main(void)
{
float a,b;
int i,j;
char c1,c2,c3;
int Retcode;
FILE*stdin;
stdin = fopen("Text2.in","r");
Retcode=fscanf(stdin,"%o 2%ld %c 5%c %c %f %f", &i,&j,&c1,&c2,&c3,&b,&a);
system("pause");
return 0;
}
就会报错了,就是把原来fp的地方换成stdin,不能运行,为什么?希望高手可以说下stdin是什么?

希望大家认真看完,帮忙解答下每个问题,对我非常重要!!谢谢

首先 fscanf 是一个函数,它的具体形式如下;
int fscanf( FILE *stream, const char *format [, argument ]... );
他的第一个参数是一个指向FILE结构体的指针;在您的程序中,stdin是c语言中的关键字,关键字就是系统中已经定义的标示符,它的原始定义是FILE * stdin;它本身就是FILE类型的指针,系统已经帮你定义好了,重复定义当然会出错;
对于Retcode = 3的原因是
fscanf的返回值说起,它的返回的是你所传递给他的变量中成功赋值的变量的个数;它的值是3,只是能说是一种偶然,因为你上面的编程方法是不对的,你首先应该把题目给定的值写到Text2.in中去然后才能够再去读它,你那样编直接就读Text2.in文件程序崩溃才对,得到3也是时一个错误的值;
希望对你有帮助!
温馨提示:答案为网友推荐,仅供参考
第1个回答  2009-10-07
stdin 是库里定义的宏。你自己重复使用了这个后,造成那行语句解释出错。

因为这个宏被定义成 #define stdin (&__iob_func()[0])
你自己做下文本替换就知道为什么编译器报告数组为0的错了。

现在回来说你的那个程序, scanf的返回值 是它成功转化并且赋值的数量。
首先 %o 使得 77 被以8进制解释为 63(7*8+7),赋给i,成功一个; 然后2%ld和 243567匹配,j变为43567(没有2),成功2个;再接着 2.4e3 的第一个字符
2 被赋给c1, 成功3个。再然后出现的.4e3不是以5开头的,转换不成功,停止了,所以最终成功转换的是3个,也就是返回值是3。

你可以简单把fscanf(stdin,"%o 2%ld %c 5%c %c %f %f", &i,&j,&c1,&c2,&c3,&b,&a);里第一个2替换为9, 即:fscanf(stdin,"%o 9%ld %c 5%c %c %f %f", &i,&j,&c1,&c2,&c3,&b,&a); 就会发现 返回值是1 了,因为只有第一个i转换成功,9开头的数和243567不匹配,停止。

以上所说的,你用F5调试,比较fscanf执行前后,变量值的改变,应该就懂了。
第2个回答  推荐于2018-03-29
参考代码如下: 
#include <stdio.h>
#include <iostream.h>
void main()
{
 FILE* EMFile = fopen("D://EMFile.TXT","r");
 if (!EMFile) {
  cout<<"FILE NOT FOUND!";
  return;
 }
 int XN=2;//假设文件有两行,三列
 int YN=3;
 float** Ef;
 Ef = new float*[XN];
 for(int idx=0;idx<XN;idx++)
 {
  Ef[idx] = new float [YN];
 }
 for(int i=0;i<XN;i++)
 {
  for(int j=0;j<YN;j++)
   Ef[i][j] = 0.0 ;
 }
 for(int xn=0;xn<XN;xn++)
 {
  for(int yn=0;yn<YN;yn++)
  {
   fscanf(EMFile,"%f",&Ef[xn][yn]);//假如是科学计数法写成%e或者%le
 }
 }
}

本回答被网友采纳
第3个回答  2020-02-28
参考代码如下:
#include <stdio.h>
#include <iostream.h>
void main()
{
FILE* EMFile = fopen("D://EMFile.TXT","r");
if (!EMFile) {
cout<<"FILE NOT FOUND!";
return;
}
int XN=2;//假设文件有两行,三列
int YN=3;
float** Ef;
Ef = new float*[XN];
for(int idx=0;idx<XN;idx++)
{
Ef[idx] = new float [YN];
}
for(int i=0;i<XN;i++)
{
for(int j=0;j<YN;j++)
Ef[i][j] = 0.0 ;
}
for(int xn=0;xn<XN;xn++)
{
for(int yn=0;yn<YN;yn++)
{
fscanf(EMFile,"%f",&Ef[xn][yn]);//假如是科学计数法写成%e或者%le
}
}
}
第4个回答  2020-01-21
如下:
//---------------------------------------------------------------------------
#include
int
main(int
argc,
char*
argv[])
{
file
*fp=fopen("c:\\1.txt","r");/*假设文件路径是c:\1.txt*/
char
line[90];
while
(fscanf(fp,"%*[^:]%*2c%s",line)!=eof)/*注意这里,由于你提供的文件内容中的冒号是中文冒号,故这里的冒号也要在中文全角状态下输入,建议使用英文的冒号*/
puts(line);
fclose(fp);
return
0;
}
//---------------------------------------------------------------------------
相似回答