| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2319 人关注过本帖
标题:文件的打开函数
只看楼主 加入收藏
nbaqqqq
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:202
专家分:137
注 册:2009-11-6
结帖率:100%
收藏
已结贴  问题点数:60 回复次数:20 
文件的打开函数
#include"stdlib.h"
#include"stdio.h"
void main(void)
{
FILE *fp;
char ch,filename[40],mode[4];
while(1)
{
printf("\n请输入一个文件名:");
gets(filename);
printf("\n输入模式:");
gets(mode);
if((fp=fopen(filename,mode))!=NULL)
{
printf("\n以%s模式成功打开文件%s!\n",mode,filename);
fclose(fp);
puts("退出请按x,其他继续。");
if((ch=getc(stdin))=='x')
break;
else
continue;
}
else
{
fprintf(stderr,"\n以%s模式打开文件%s失败!\n",mode,filename);
puts("退出请按x,其他继续。");
if((ch=getc(stdin))=='x')
break;
else
continue;
}

}
}
这是书上的例题,运行的结果
图片附件: 游客没有浏览图片的权限,请 登录注册
问题:先执行以r模式打开文件gg,打开失败执行
if((ch=getc(stdin))=='x')
break;
else
continue;
我百度了下if((ch=getc(stdin))=='x')中的getc(stdin)的作用是取得键盘缓冲区中的一个字符赋给ch(ch到后面怎么没用过,只是不断的把键盘缓冲区中的一个字符赋给ch),再continue;
跳出此次循环,进入下一循环,执行语句
printf("\n请输入一个文件名:");
gets(filename);
printf("\n输入模式:");
gets(mode);
问题出来了,为什么gets(filename);这一句没执行就gets(filename);  感觉还把  g赋给了fp=fopen(filename,mode)中的filename?->>>就 以w模式成功打开文件g 这句
在网上还找到两个差不多的程序
#include<stdio.h>
void main(void)
{
char a;
a=getc(stdin);
printf("%c\n",a);

}
图片附件: 游客没有浏览图片的权限,请 登录注册


#include<stdio.h>

void main(void)
{

while(1){
char a;
a=getc(stdin);
printf("%c",a);

}

}
图片附件: 游客没有浏览图片的权限,请 登录注册
为什么这两个差不多结果就不一样,第二个不就无限循环了下吗

                             麻烦大家讲解       谢谢
搜索更多相关主题的帖子: 文件 函数 
2010-02-11 18:37
木瓜君
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:67
专家分:144
注 册:2009-10-17
收藏
得分:25 
我也搜了一下~
getc()从流中读取字符时,getc函数接受流时,内含一个指针是用来指向内存里的缓存,读一个字符以后,指针+1然后继续读next。

这和你所得的结果应该是相符合的吧~
第一个程序:
a = getc(stdin)
printf("%c",a); 从缓冲区读取一个字符,getc内含的指针后移;但只有一次赋值语句,所以a只获取了第一个字符
第二个程序:
while(1){
char a;
a=getc(stdin);
printf("%c",a);
}
a获取一个字符后,getc内含的指针后移,a在printf出之后,继续获取下一个字符。如此循环~
直到获取完缓冲区的字符为止~~
从最后一张图片可以看出,a是'\n',回车符~~是最后一个字符~
2010-02-11 19:33
nbaqqqq
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:202
专家分:137
注 册:2009-11-6
收藏
得分:0 
             但上面的那个我还是搞不懂   gets函数是不是直接读键盘缓冲区?我写了个程序试了下还好像真是
#include<stdio.h>
void main(void)
{char str[10];
char a;
a=getc(stdin);
printf("%c\n",a);
gets(str);
printf("%s",str);
}
图片附件: 游客没有浏览图片的权限,请 登录注册
可我对这程序的结果也不懂,书上有个fgets()函数一般形式为fgets(buf,n,fp)该函数从fp所指的文件中读取n-1个字符,放到字符数组buf中。gets是不是就是这个fgets?
2010-02-11 21:13
zhddragon
Rank: 5Rank: 5
等 级:职业侠客
帖 子:208
专家分:346
注 册:2009-5-14
收藏
得分:0 
以下是引用nbaqqqq在2010-2-11 21:13:34的发言:

             但上面的那个我还是搞不懂   gets函数是不是直接读键盘缓冲区?我写了个程序试了下还好像真是
#include<stdio.h>
void main(void)
{char str[10];
char a;
a=getc(stdin);
printf("%c\n",a);
g ...
getc是读输入缓冲区不是读键盘的缓冲区。getc执行的时候先查看输入缓冲区,如果缓冲区里有数据直接从缓冲区中取一个字符然后返回,否在等待用户输入并以回车作为输入终止符,然后把输入放置到输入的缓冲区中,再从缓冲区中取出一个字符作为返回。

在你上面这个例子中第一次调用getc时它的缓冲区没有数据,于是等待输入,你输入fffff然后回车,它把fffff存放到缓冲区中,然后取出第一个f返回,printf打印出第一个f,循环遇到第二个getc时,它查看缓冲区时发现有数据,于是直接取出一个f返回,printf打印出第二个f,如此类推

[ 本帖最后由 zhddragon 于 2010-2-11 22:44 编辑 ]

身体是玩命的本钱
2010-02-11 22:37
nbaqqqq
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:202
专家分:137
注 册:2009-11-6
收藏
得分:0 
你解释的getc二楼已经解答了,而且那个例子里没循环啊。       我是想问gets()函数是不是直接读键盘缓冲区,上面那个程序为什么会输出三个fff?不过还是要谢谢你,我对getc了解得更清楚了。
2010-02-11 22:50
zhddragon
Rank: 5Rank: 5
等 级:职业侠客
帖 子:208
专家分:346
注 册:2009-5-14
收藏
得分:5 
看成2楼的代码了

这个问题没明白那是因为你没有搞明白一个问题“所有的c标准的带缓冲的对标准输入操作的输入函数使用同一个输入缓冲区”。

[ 本帖最后由 zhddragon 于 2010-2-11 23:04 编辑 ]

身体是玩命的本钱
2010-02-11 23:00
nbaqqqq
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:202
专家分:137
注 册:2009-11-6
收藏
得分:0 
额 是我没说清楚   那两个网上找的例子懂了      但最上面课本上的还没弄清楚
图片附件: 游客没有浏览图片的权限,请 登录注册

有缓冲数据以后(第一次循环以后)它都会把后面的字符(除第一位)赋给filename(输ggr它会显示gr)
就想那个例子一样,输fff,会显示fff。不知道为什么
2010-02-11 23:05
zhddragon
Rank: 5Rank: 5
等 级:职业侠客
帖 子:208
专家分:346
注 册:2009-5-14
收藏
得分:30 
这个跟网上那个是一样的原因,运行到if((ch=getc(stdin))=='x')时,如果你输入的是ggg,那么第一个g会被getc从标准输入缓冲区取出返回,因为if为假就会继续循环,会执行到gets(filename);,这是你的标准输入缓冲区里还有两个gg,这时gets会直接从标准输入中读出剩余的字符赋给file。


[ 本帖最后由 zhddragon 于 2010-2-11 23:19 编辑 ]

身体是玩命的本钱
2010-02-11 23:14
nbaqqqq
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:202
专家分:137
注 册:2009-11-6
收藏
得分:0 
以下是引用zhddragon在2010-2-11 23:00:02的发言:

看成2楼的代码了

这个问题没明白那是因为你没有搞明白一个问题“所有的c标准的带缓冲的对标准输入操作的输入函数使用同一个输入缓冲区”。
  怪不得gets不用赋值,是因为getc输了值到(公用)缓冲区。但为什么把第一个字符排除用后面的字符(输ffff  gets只把fff赋给了数组str)?
2010-02-11 23:16
nbaqqqq
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:202
专家分:137
注 册:2009-11-6
收藏
得分:0 
   那个例子也是         第一个f会被getc从标准输入缓冲区取出返回赋给a         
2010-02-11 23:26
快速回复:文件的打开函数
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.027005 second(s), 10 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved