*/ --------------------------------------------------------------------------------------
*/ 出自: 编程中国 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编辑过]
----------------解决方案--------------------------------------------------------
你那个程序读取不了 第二行 也不可能输出的是你那个结果
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;
----------------解决方案--------------------------------------------------------
你怎么知道in始终指向文件头呢?‘
in始终指向文件头的话 为什么我的那个程序能读取到 22呢?
我也一直以为in所指向的值会变,结果我在VC下一调试,结果都是指向文件头,所以我才纳闷来这里提问
----------------解决方案--------------------------------------------------------
啊? 你怎么调试的?
----------------解决方案--------------------------------------------------------