c语言fscanf,c语言,怎么用fscanf()把数据读到动态数组中?
c语言fscanf,c语言,怎么用fscanf()把数据读到动态数组中?详细介绍
本文目录一览: C语言fscanf的用法是什么
用 法: int fscanf(FILE *stream, char *format,[argument...])。
1、fscanf()的format参数允许的格式为:“%[*][width][modifiers]type”。[]中的内容根据需要供选,可缺省,%type必须要有,不可省。
2、“format”是C字符串,由“空格”、“非空格”及“转换符”组成。具体格式为%[*][width][modifiers]type,与“format”中“转换符”对应变量地址的列表,两地址间用逗号隔开。
fscanf()对空格的处理示例代码如下:
re = fscanf(pF, "%d%d%d", &oLine.p, &oLine.l, &oLine.x); if( 3 == re){ //Print on stdout printf("%d\t%d\t%d\n", oLine.p, oLine.l, oLine.x); }
C语言中fscanf()的用法
首先,你要确认你的这个文件名是正确的,这个文件名没有隐藏的后缀名,其次,你这个文件放的位置要正确,要放在你的工程的路径下,如果你不知道要将这个文件放在哪里,请把你的代码中fp = fopen("121.text", "r")的"121.text"这个改成绝对路径 :比如说:"F:\CWorkspace\hello\121.text",这个路径要看你具体存放在哪里了
另外,你的程序有些问题,我给你改好了,如果你的文件没问题的话用这个就可以运行了
#include
int main()
{
struct student
{
char num[10];
char name[10];
float score[3];
float avg;
} t[100];
FILE *fp;
int i, n = 2;
/***************************************************************************/
if ((fp = fopen("121.text", "r")) == NULL)
{
printf("没有此文件\n");
perror("fopen");
exit(0);
}
for (i = 0; i < n; i++)
fscanf(fp, "%s%s%f%f%f%f", t[i].num, t[i].name, &t[i].score[0], &t[i].score[1],
&t[i].score[2], &t[i].avg);
fclose(fp);
/*****************************************************************************/
for (i = 0; i < n; i++)
printf("%s\t%s\t%-5.2f\t%-5.2f\t%-5.2f\t%-5.2f\t\n", t[i].num,
t[i].name, t[i].score[0], t[i].score[1], t[i].score[2],
t[i].avg);
return 0;
}
功 能: 从一个流中执行格式化输入\x0d\x0a 用 法: int fscanf(FILE *stream, char *format,[argument...]);\x0d\x0a int fscanf(文件指针,格式字符串,输入列表);\x0d\x0a 返回值:整型,数值等于[argument...]的个数\x0d\x0a 程序例:\x0d\x0a #include \x0d\x0a #include \x0d\x0a int main(void)\x0d\x0a {\x0d\x0a int i;\x0d\x0a printf("Input an integer: ");\x0d\x0a if (fscanf(stdin, "%d", &i))\x0d\x0a printf("The integer read was: %d\n",\x0d\x0a i);\x0d\x0a else\x0d\x0a {\x0d\x0a fprintf(stderr, "Error reading an \\x0d\x0a integer from stdin.\n");\x0d\x0a exit(1);\x0d\x0a }\x0d\x0a return 0;\x0d\x0a }\x0d\x0a 返回EOF如果读取到文件结尾。
c语言:fscanf(fp,%[^ ])为什么可以跳过全部字符直到下一个换行符
%*[^\n]这个通配符的意思就是跳过所有字符 直到换行符为止。
^for (i=0;i<2;i++) fscanf(fin,"%*[^\n]%*c"); 跳过2行。
%* 是“跳过”
[^\n] 字符串的分隔符是"\n", 中括号里可以写 分隔符 表
%*[^\n] 跳过 \n 前的所有字符串。
%*c 是“跳过”行尾 的 换行符。
#include
#include
main()
{
FILE *fin;
int x,y;
int i;
fin=fopen("a.txt","r");
for (i=0;i<2;i++) fscanf(fin,"%*[^\n]%*c"); // 跳2 行
fscanf(fin,"%d %d",&x,&y); // 读 2 个 int
printf("%d %d\n",x,y); // 打出 3 33
fclose(fin);
}
扩展资料:
可以使用星号代替零个、单个或多个字符。如果正在查找以AEW开头的一个文件,但不记得文件名其余部分,可以输入AEW*,查找以AEW开头的所有文件类型的文件,如AEWT.txt、AEWU.EXE、AEWI.dll等。要缩小范围可以输入AEW*.txt,查找以AEW开头的所有文件类型并.txt为扩展名的文件如AEWIP.txt、AEWDF.txt。
可以使用问号代替一个字符。如果输入love?,查找以love开头的一个字符结尾文件类型的文件,如lovey、lovei等。要缩小范围可以输入love?.doc,查找以love开头的一个字符结尾文件类型并.doc为扩展名的文件如lovey.doc、loveh.doc。
参考资料来源:百度百科-通配符
因为%*[^\n]这个通配符的意思就是跳过所有字符 直到换行符为止。
*是跳过,^\n是“换行符”,连起来就是“跳过不是换行符的所有字符”,直到遇到第一个换行符就停下了。
fscanf是不定参数的。前者从fp中读取一个v,后者从fp中读取若干个空白字符,包括' ','\n','\t'等。
扩展资料:fscanf 函数原型为 int fscanf(FILE * stream, const char * format, [argument...]);。format 说明符形式为[=%[*][width][modifiers]type=]
其功能为根据数据格式(format),从输入流(stream)中读入数据,存储到argument中,遇到空格和换行时结束。fscanf位于C标准库头文件
中。
参考资料来源:百度百科—fscanf
%*[^\n]
这个通配符的意思就是
跳过所有字符 直到换行符为止。
更具体的 你可以百度
C语言scanf中正则的使用
有很多说明的文章的。
你写的就是这个意思啊!*是跳过,^\n是“不是换行符”,连起来不就是“跳过不是换行符的所有字符”吗?直到遇到第一个换行符就停下来了!
通配符*
%*[^\n]这个通配符的意思,就是跳过所有字符,直到换行符为止。
scanf是格式输入函数,功能是在屏幕上输入指定的信息。简单的来说和printf相似却不相同。
scanf调用格式: scanf("
",
);
如:
#include
int main()
{
int a,b,c;
printf(“input three data:\n”);//使用 scanf 之前先用 printf 提示输入。
scanf("%d%d%d",&a,&b,&c); // scanf 的“输入参数”中,前面的取地址符&记住
printf("%d,%d,%d/n",a,b,c);
return 0;
}
扩展资料:
C语言通配符:
%a,%A:读入一个浮点值(仅C99有效)
%c:读入一个字符
%d:读入十进制整数
%i:读入十进制,八进制,十六进制整数
%o:读入八进制整数
%x,%X:读入十六进制整数
%s:读入一个字符串,遇空格、制表符或换行符结束。
%f,%F,%e,%E,%g,%G:用来输入实数,可以用小数形式或指数形式输入。
%p:读入一个指针
%u:读入一个无符号十进制整数
%n:至此已读入值的等价字符数
%[]:扫描字符集合
%%:读%符号
地址表>
格式化字符串>
fscanf函数的用法
fscanf函数的用法为“intfscanf(FILE*stream,char*format,[argument...]);”,所有符号需在英文模式下输出。
fscanf()函数(有点像正则表达式),功能是从一个流中执行格式化输入,fscanf遇到空格和换行时结束,注意空格时也结束。
scanf()是C语言中的一个输出函数。与printf函数一样,都被声明在头文件stdio.h里,因此在使用scanf函数时要加上#include
。
scanf()函数的指定输入格式有很多种,下面是一些比较常用的格式:
%d:读入可选有符号的十进制整数。
%u:读入无符号符号十进制整数。
%a,e,f,g,A,E,F,G: 读入可选有符号浮点数,输入格式应该像strtod函数识别的字符序列一样。
%o:读入可选有符号八进制整数。
%s:读入一个的字符序列,后面会加上空字节,遇到空白字符(\t \r \n 空格等)完成读取。
使用格式:
scanf()是C语言中的一个输入函数。与printf函数一样,都被声明在头文件stdio.h里,因此在使用scanf函数时要加上#include
。
(在有一些实现中,printf函数与scanf函数在使用时可以不使用预编译命令#include
。)它是格式输入函数,即按用户指定的格式从键盘上把数据输入到指定的变量之中。
C语言文件读取fscanf(),该怎么处理
……
因为%s在读取的时候需要遇到分隔符才中断,所以你文件保存的数据之间要有空格。也就是说你文件中保存的应该是1
tt
66
66
66
66
66
330。即在保存时,应为:
fprintf(fp,"%d
%s
%d
%d
%d
%d
%d
%d",
&r[i].key,
r[i].name,
&r[i].score[0],
&r[i].score[1],
&r[i].score[2],
&r[i].score[3],
&r[i].score[4],
&r[i].total);
fscanf位于头文件
中,函数原型为int fscanf(FILE*stream, constchar*format, [argument...]); 其功能为根据数据格式(format)从输入流(stream)中写入数据(argument);与fgets的差别在于:fscanf遇到空格和换行时结束,注意空格时也结束,fgets遇到空格不结束。
函数名: fscanf
功 能: 从一个流中执行格式化输入,fscanf遇到空格和换行时结束,注意空格时也结束。这与fgets有区别,fgets遇到空格不结束。
返回值:整型,成功返回读入的参数的个数,失败返回EOF(-1)。
用法:
1 int fscanf(FILE*stream,constchar*format,[argument...]);
FILE *stream:文件指针
char *format:格式字符串
[argument...]:输入列表
格式字符说明
常用基本参数对照:
%d:读入一个十进制整数.
%i :读入十进制,八进制,十六进制整数,与%d类似,但是在编译时通过数据前置或后置来区分进制,如加入“0x”则是十六进制,加入“0”则为八进制。例如串“031”使用%d时会被算作31,但是使用%i时会算作25.
%u:读入一个无符号十进制整数.
%f %F %g %G : 用来输入实数,可以用小数形式或指数形式输入.
%x %X: 读入十六进制整数.
%o': 读入八进制整数.
%s : 读入一个字符串,遇空字符‘\0'结束。
%c : 读入一个字符。无法读入空值。空格可以被读入。
附加格式说明字符表修饰符说明
L/l 长度修饰符 输入"长"数据
h 长度修饰符 输入"短"数据
示例说明
如果要求从标准输入中输入一串字符串和一个整型数,那么参数“%s%d”表示什么呢?默认情况下,在终端上(这里假设程序为控制台应用程序)输入第一个参数的值的时候敲下回车,则在第二行输入的为第二个参数值,采用这种输入方法那么格式字符的形式就无关紧要了。[1]
这里要特殊说明的是如果参数在同一行给出,那么格式字符的参数与终端的输入会有什么关系。举个例子:如果格式字符为“%s+%d”,那么参数的输入就应该为 string + integer。
程序例
例一
#include
#include
int main(void)
{
int i;
printf("Input an integer:");
/*从标准输入中读取一个整数*/
if(fscanf(stdin, "%d",&i))
printf("The integer read was:%d\n", i);
else
{
fprintf(stderr, "Error reading an integer from stdin.\n");
exit(1);
}
return 0;
}
返回EOF如果读取到文件结尾。
例二
附:MSDN中例子
#include
FILE *stream;
int main(void)
{
long l;
float fp;
char s[81];
char c;
stream = fopen("fscanf.out", "w+");
if(stream==NULL)
printf("The file fscanf.out was not opened\n");
else
{
fprintf(stream,"%s%ld%f%c","a-string", 65000,3.14159, 'x');
/*将指针设置至文件开头*/
fseek(stream,0L,SEEK_SET);
/*从文件中读取数据*/
fscanf(stream,"%s",s);
fscanf(stream,"%ld",&l);
fscanf(stream,"%f",&fp);
fscanf(stream,"%c",&c);
/*输出读取的数据*/
printf("%s\n",s);
printf("%ld\n",l);
printf("%f\n",fp);
printf("%c\n",c);
fclose(stream);
}
return 0;
}//这样会有意外输出
关于C语言读取文件及fscanf函数的问题
你的fp1=fp;这里是可以这样用的,但是你要注意此时你的fp文件指针已经移到文件末尾了,你此时再这样用就指空了,所以出错了,你必须得在程序还未使用fp是把地址赋给fp1,或者使用rewind(fp)函数将指针重新一会文件首,在用fp1=fp;这样就对了。
fp,fp1都是文件指针,当你把fp赋给fp1时,两者指的是同一内容,而且其中包含了位置信息,对fp1操作时又改变了位置信息,第二次循环时fp的内容已经改变
用fp1=fp;后,再用fp1操作文件并没有错,但你追问的想法却实现不了。不过原因不在于fp1与fp有什么影响,而在于它两操作的是同一个文件,不论用哪个指针操作,操作后指针承载的位置信息就要发生变化;再用另一个指针时,就与文件的实际操作位置不一致了,从而导致意想不到的问题……
//fp1=fp; //look at here (3) 你这种用法很“奇葩"
for(j=0;j<15;j++) //look at here (4)
fscanf(fp,"%c",&a[1][j]); //依然用fp去读不好吗?
函数名: fscanf
功 能: 从一个流中执行格式化输入,fscanf遇到空格和换行时结束,注意空格时也结束。这与fgets有区别,fgets遇到空格不结束。
返回值:整型,成功返回读入的参数的个数,失败返回EOF(-1)。
用法:
1 int fscanf(FILE*stream,constchar*format,[argument...]);
FILE *stream:文件指针;
char *format:格式字符串;
[argument...]:输入列表。
例如:
FILE* fp;
char a[10];
int b;
double c;
fscanf(fp , "%s %d %lf" , a , &b , &c);
和scanf一样,格式化串的空格不代表读取的子串有空格,存放读取数据的参数都是指针。
扩展阅读,C语言中文件的读取和写:
FILE *pFile=fopen("1.txt","r"); //获取文件的指针
char *pBuf; //定义文件指针
fseek(pFile,0,SEEK_END); //把指针移动到文件的结尾 ,获取文件长度
int len=ftell(pFile); //获取文件长度
pBuf=new char[len+1]; //定义数组长度
rewind(pFile); //把指针移动到文件开头 因为我们一开始把指针移动到结尾,如果不移动回来 会出错
fread(pBuf,1,len,pFile); //读文件
pBuf[len]=0; //把读到的文件最后一位 写为0 要不然系统会一直寻找到0后才结束
MessageBox(pBuf); //显示读到的数据
fclose(pFile); // 关闭文件
C语言中fscanf函数使用后位置指针会往下移动么?
会,所以用fscanf 把文件中的内容输入到变量中的时候,不会只输第一行的内容,指针会自动向下移,如果写入成功返回写入的个数,不成功返回EOF,希望能帮到你
rewind(stdin); stdin是C标准库定义的标准文件之一,它与键盘相关联。
一般把它理解为指向键盘这个“文件”的指针。 而rewind()函数的作用是把文件的当前位置指针指向文件头。
两者结合,rewind(stdin);的作用也就是把“指向键盘(一个文件)的指针移到文件头,相当于清空清空键盘缓冲区,语句可以达到很好的清空键盘缓冲区的作用。不用考虑太多其他因素
会的,
在读取数据成功时会移动。
C语言中,对文件指针会产生移动作用的函数包括:
1 读函数: fread, fgetc, fgets, fscanf等。执行读操作时,指针向后移动,移动距离为实际读到的字节数。
2 写函数:fwrite, fputc, fputs,fprintf等。执行写操作时,指针向后移动,移动距离为实际写入的字节数。
3 指针移动函数:fseek, rewind等。按照函数功能,自由移动文件指针。
fscanf在读取数据成功时,即返回值>0时,会移动文件指针。如返回值<=0,代表读操作失败,不会产生指针移动。
C语言用fscanf()函数如何读取文件全部内容?
int []account;
for(int i=0;!feof(file_p);++i) /*file_p是文件标识符*/
{
fscanf(file_p,"%d",account[i]);
}
int []account;
for(int i=0;!feof(file_p);++i) /*file_p是文件标识符*/
{
fscanf(file_p,"%d",account[i]);
}
#include
void main( void )
{
FILE *f;
int a,b,c,d,e;
f = fopen("a.txt", "r");
while(fscanf(f,"%d %d %d %d %d",&a,&b,&c,&d,&e)==5)
{
//你的代码
}
fclose(f);
}
void read_txt(const char* Input, const char* Output){
FILE *fin = fopen(Input, "rb");//以二进制读入
FILE *fout = fopen(Output, "w");
unsigned char ch1,ch2;
while(fscanf(fin, "%c%c", &ch1,ch2) != EOF){//直到文件结束
fprintf(fout, "%d%d", ch1,ch2);//以10进制输出
}
}
int main(){
read_txt("D:/IN.txt","D:/OUT.txt");//txt文件目录
return 0;
}
注:判断文件结束处的语句:fscanf(fin, "%c%c", &ch1,ch2)。其中两个%c之间不能加空格,否则读到的二进制文件会不完整,比源文件少好多个字节
C语言如何用fscanf按行读取一段固定格式
你可以用fgets()按行读取内容到 字符串变量里,然后处理。
假如已读入到 str[80] 里:
char str[80]="OR2_X2 C401 ( .A1(n66), .A2(n85), .ZN(N142) )";
多行这样的文字格式,
如果位置固定,可以直接读出:
char r[4][5];
sscanf(str,"%s",r[0]); r[0][3]='\0';printf("%s\n",r[0]);
sscanf(str+18,"%s",r[1]); r[1][2]='\0';printf("%s\n",r[1]);
sscanf(str+28,"%s",r[2]); r[2][3]='\0';printf("%s\n",r[2]);
sscanf(str+38,"%s",r[3]); r[3][4]='\0';printf("%s\n",r[3]);
------------------------
如果位置不固定,我们可以用查找 点号的位置加4:
int i,j,L[3];
j=0;
for (i=0;i
<strlen(str);i++){
if (str[i]=='.'){L[j]=i+4; j++;}
}
sscanf(str,"%s",r[0]); r[0][3]='\0';printf("%s\n",r[0]);
sscanf(str+L[0],"%s",r[1]); r[1][2]='\0';printf("%s\n",r[1]);
sscanf(str+L[1],"%s",r[2]); r[2][3]='\0';printf("%s\n",r[2]);
sscanf(str+L[2],"%s",r[3]); r[3][4]='\0';printf("%s\n",r[3]);
在fscanf的第二个参数,格式字符串中,指定对应的格式即可。
fscanf与scanf类似,可以格式化输入一组数据,不过不是从终端,而是从对应文件中。
其声明为:
int fscanf(FILE *fp, const char *fmt, ...);
功能为从打开的文件fp中,根据fmt格式字符,读取数据到后续参数中,并返回实际读取的个数。
比如,文件中存着以逗号分隔的三个整型数值,那么将其读取的操作即
fscanf(fp,"%d:%d:%d",&a,&b,&c);
其中,fp为打开的文件指针,abc分别是三个整型变量。
</strlen(str);i++){
c语言,怎么用fscanf()把数据读到动态数组中?
a[] = "
要经过如下几个步骤:
1 打开文件。
2 创建动态数组。如果事先可以预知数据总数,或者可以通过打开的文件获取到需要读取的数量,那么这一步可以使用已知或读取到的值来创建动态数组。否则可以先暂定一个大小,在实际读取中如出现不足再用realloc函数重新分配。
3 格式化读取数据。用scanf读取数据。直到读取到所有需要的数据,或者出错为止。
4 关闭文件。
5 使用读取到的文件。
下面以不确定总数的方式为例,提供一个参考代码。
假定文件名为in.txt, 所存数据均为合法int型,以空格或换行分隔。
#include
#include
int main(){ FILE *fp = NULL; int n=0;//标识已经读到的数据数量 int len = 100; //标识分配的动态数组大小.初始设定为100 int *a = NULL; //动态数组名 int i; fp = fopen("r", "in.txt"); //以读的方式打开文件 if(fp == NULL) return -1; //打开文件出错,返回。 a = (int *)malloc(sizeof(int) * len); if(a == NULL) return -2; //分配内存出错,返回。 while(1) { if(scanf("%d",a+n) == EOF)break;//读取到文件结尾结束输入。 n++; if(n >= len)//数组空间不足。 { len+=100;//增加100个元素空间。 a = realloc(sizeof(int) * len);//重新分配内存。 if(a==NULL)return -2; // 分配内存出错。 } } printf("共读取到%d个元素\n", n); for(i = 0; i < n; i ++) printf("%d\n", a[i]);//打印所有读到的元素。 free(a);//程序结束,释放内存。 return 0;}