关于C语言读取文件及fscanf函数的问题
程序如下:#include<stdio.h>#include<stdlib.h>intmain(){chara[2][15];inti=0,j=0,k=0;FILE*fp...
程序如下:
#include <stdio.h>
#include <stdlib.h>
int main()
{
char a[2][15];
int i=0,j=0,k=0;
FILE* fp=fopen("out.txt","r");
FILE* fp1=NULL;
if(fp==NULL)
{
printf("Wrong!");
return 0;
}
for(i=0;i<10;i++)
{
for(j=0;j<15;j++)
fscanf(fp,"%c",&a[0][j]); //look at here (1)
for(j=0;j<15;j++)
printf("%c",a[0][j]); //look at here (2)
printf("---");
printf("%d",i);
printf("\n");
fscanf(fp,"\n");
fp1=fp; //look at here (3)
for(j=0;j<15;j++) //look at here (4)
fscanf(fp1,"%c",&a[1][j]); //look at here (5)
/*for(j=0;j<15;j++)
printf("%c",a[1][j]);
printf("\n"); */
}
}
问题描述:out.txt是里面有10组15个字符的文件,以换行符分割。标注(3)是让fp赋给另一个指针fp1,指向下一组。但是我发现,有了标注(4)、(5)会导致标注(1)、(2)的运作不正常,不知道是什么原因。如果把标注(4)、(5)注释掉,那么printf("%c",a[0][j])显示一切正常。
难道是fscanf(fp1,"%c",&a[1][j])对fp造成了影响? 展开
#include <stdio.h>
#include <stdlib.h>
int main()
{
char a[2][15];
int i=0,j=0,k=0;
FILE* fp=fopen("out.txt","r");
FILE* fp1=NULL;
if(fp==NULL)
{
printf("Wrong!");
return 0;
}
for(i=0;i<10;i++)
{
for(j=0;j<15;j++)
fscanf(fp,"%c",&a[0][j]); //look at here (1)
for(j=0;j<15;j++)
printf("%c",a[0][j]); //look at here (2)
printf("---");
printf("%d",i);
printf("\n");
fscanf(fp,"\n");
fp1=fp; //look at here (3)
for(j=0;j<15;j++) //look at here (4)
fscanf(fp1,"%c",&a[1][j]); //look at here (5)
/*for(j=0;j<15;j++)
printf("%c",a[1][j]);
printf("\n"); */
}
}
问题描述:out.txt是里面有10组15个字符的文件,以换行符分割。标注(3)是让fp赋给另一个指针fp1,指向下一组。但是我发现,有了标注(4)、(5)会导致标注(1)、(2)的运作不正常,不知道是什么原因。如果把标注(4)、(5)注释掉,那么printf("%c",a[0][j])显示一切正常。
难道是fscanf(fp1,"%c",&a[1][j])对fp造成了影响? 展开
5个回答
展开全部
函数名: 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); // 关闭文件
功 能: 从一个流中执行格式化输入,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); // 关闭文件
展开全部
你的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去读不好吗?
for(j=0;j<15;j++) //look at here (4)
fscanf(fp,"%c",&a[1][j]); //依然用fp去读不好吗?
更多追问追答
追问
我的原来程序是这样的,让第一个指针指向第一组,第二个指针指向第二、三、四...组,第一组和第二、三、四...组的数据比较。然后第一个指针指向第二组,第二个指针指向第三、四...组,做数据比较。
谢谢你。
追答
呵呵,你这样是做不到的!
除非你采用两次打开文件才可以!
fp1 fp指向同一个打开的文件指针,相互影响,只能分两次打开文件才可以:
fp1=fopen("out.txt","r");
if(fp1==NULL)
{
printf("Wrong2!");
return 0;
}
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询