当前位置: 代码迷 >> C语言 >> [求助]fgets函数使用请教
  详细解决方案

[求助]fgets函数使用请教

热度:272   发布时间:2007-07-09 22:06:07.0
[求助]fgets函数使用请教

*/ --------------------------------------------------------------------------------------
*/ 出自: 编程中国 http://www.bc-cn.net
*/ 作者: wangjian2006 QQ:464663391
*/ 时间: 2007-7-9 编程论坛首发
*/ 声明: 尊重作者劳动,转载请保留本段文字
*/ --------------------------------------------------------------------------------------


先看一段小代码

#include<stdio.h>
#include<string.h>

void main()
{
FILE *in = NULL;
char *p = NULL;
char xx[3][3] = {0, };
int i = 0;

//打开in.dat文件,该文件中有两行数据,第一行为11,第二行为22
in = fopen("in.dat","r");

//第一次调用fgets函数
p = fgets(xx[0],3,in);
printf("\nxx[0] = %s",xx[0]);

//第二次调用fgets函数
p = fgets(xx[0],3,in);
printf("\nxx[0] = %s",xx[0]);

*p = NULL;
fclose(in);
};


可能大家都知道输出结果理所当然是:
11
22

我的疑问是在执行fgets(xx[0],3,in)前后,指针in不变,返回的指针p也不会变(都是指向&xx[0][0]);

那么程序凭借什么在第二次执行fgets时去从第二行开始获取??

不知道我表达的意思大家明白不?或许程序自己定义了一个指针来指向执行后的开始地址?

[此贴子已经被作者于2007-7-9 23:20:03编辑过]

搜索更多相关的解决方案: fgets  函数  中国  include  

----------------解决方案--------------------------------------------------------
你那个程序读取不了 第二行 也不可能输出的是你那个结果
in指针是文件流指针 不可能指向(都是指向&xx[0][0]);
我看你文件学的太不扎实了 你在重新学一边吧
还有 以后发求助帖的时候不开【原创】
下面是我改的程序
#include<stdio.h>
#include<string.h>
void main()
{
FILE *in;
char xx[3][3];
int i = 0;
//打开in.dat文件,该文件中有两行数据,第一行为11,第二行为22
in = fopen("in.txt","r");
//第一次调用fgets函数
fgets(xx[0],4,in);
printf("\nxx[0] = %s",xx[0]);

//第二次调用fgets函数
fgets(xx[1],3,in);
printf("\nxx[1] = %s",xx[1]);
fclose(in);
}
----------------解决方案--------------------------------------------------------

楼上的同志,没看懂我的问题就开始批人一顿,都替你捏把汗


----------------解决方案--------------------------------------------------------
不过有一点你确实说对了,代码是我随手写的,没有编译过,结果确实错了。

正确结果是:
11
11

奇怪了,可能是我之前碰到的问题哪里记录有误。。正在改代码再看看

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

晓得问题出在哪了
#include<stdio.h>
#include<string.h>

void main()
{
FILE *in = NULL;
char *p = NULL;
char xx[3][3] = {0, };
int i = 0;

//打开in.dat文件,该文件中有两行数据,第一行为11,第二行为22
in = fopen("in.dat","r");

//第一次调用fgets函数
p = fgets(xx[0],4,in);
printf("\nxx[0] = %s",xx[0]);

//第二次调用fgets函数
p = fgets(xx[0],4,in);
printf("\nxx[0] = %s",xx[0]);

*p = NULL;
fclose(in);
};

2楼的同志提醒了我,要读(4-1)位,这样才能读到'\n',这也似乎回答了我自己的问题 ,只有在读到'\n'的情况下,第二次调用gets时才会读第二行。


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

那程序到底是怎样实现的,在读到'\n'的情况下“记忆”一次,然后第二次调用gets时才会读下一行?

in 始终指向文件头;
p 始终指向&xx[0][0];


----------------解决方案--------------------------------------------------------
你怎么知道in始终指向文件头呢?‘
in始终指向文件头的话 为什么我的那个程序能读取到 22呢?

[此贴子已经被作者于2007-7-9 23:53:17编辑过]


----------------解决方案--------------------------------------------------------
struct _iobuf {
char *_ptr;
int _cnt;
char *_base;
int _flag;
int _file;
int _charbuf;
int _bufsiz;
char *_tmpfname;
};
typedef struct _iobuf FILE;
----------------解决方案--------------------------------------------------------
以下是引用mp3aaa在2007-7-9 23:48:29的发言:
你怎么知道in始终指向文件头呢?‘
in始终指向文件头的话 为什么我的那个程序能读取到 22呢?

我也一直以为in所指向的值会变,结果我在VC下一调试,结果都是指向文件头,所以我才纳闷来这里提问


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

啊? 你怎么调试的?


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