| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2319 人关注过本帖
标题:文件的打开函数
取消只看楼主 加入收藏
nbaqqqq
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:202
专家分:137
注 册:2009-11-6
结帖率:100%
收藏
已结贴  问题点数:60 回复次数:11 
文件的打开函数
#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
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
nbaqqqq
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:202
专家分:137
注 册:2009-11-6
收藏
得分:0 
你解释的getc二楼已经解答了,而且那个例子里没循环啊。       我是想问gets()函数是不是直接读键盘缓冲区,上面那个程序为什么会输出三个fff?不过还是要谢谢你,我对getc了解得更清楚了。
2010-02-11 22:50
nbaqqqq
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:202
专家分:137
注 册:2009-11-6
收藏
得分:0 
额 是我没说清楚   那两个网上找的例子懂了      但最上面课本上的还没弄清楚
图片附件: 游客没有浏览图片的权限,请 登录注册

有缓冲数据以后(第一次循环以后)它都会把后面的字符(除第一位)赋给filename(输ggr它会显示gr)
就想那个例子一样,输fff,会显示fff。不知道为什么
2010-02-11 23:05
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
nbaqqqq
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:202
专家分:137
注 册:2009-11-6
收藏
得分:0 
懂了          谢谢你们
2010-02-11 23:28
nbaqqqq
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:202
专家分:137
注 册:2009-11-6
收藏
得分:0 
  stdin 是文件缓冲区         呵呵   是好长  一个书上的例题就这么多不懂        现在又看下发现还有两个不清楚的     
ch=getc(stdin))=='x'中的字符数组ch应该可以去掉吧没啥用占内存
fprintf(stderr,"\n以%s模式打开文件%s失败!\n",mode,filename);中的stderr不太清楚,网上说是标准错误输出设备,显示器?
还有个例子
#include"stdio.h"
void main()
{
fprintf(stderr, "Can't open it!\n");
fprintf(stdout, "Can't open it!\n");
printf("Can't open it!\n");
}
图片附件: 游客没有浏览图片的权限,请 登录注册

“如果转向标准输出到磁盘文件tmp.txt
my.exe > tmp.txt
Can't open it!

用TYPE 看 tmp.txt的内容:
TYPE tmp.txt
Can't open it!
Can't open it! 用转向标准输出到磁盘文件,则可看出两者区别。stdout输出到磁盘文件,stderr在屏幕。”
可我不知道怎么转向标准输出到磁盘文件tmp.txt和怎么用用TYPE 看 tmp.txt的内容
2010-02-12 11:42
nbaqqqq
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:202
专家分:137
注 册:2009-11-6
收藏
得分:0 
  但怎么怎么转向标准输出到磁盘文件tmp.txt和怎么用用TYPE 看 tmp.txt的内容呢
2010-02-12 15:02
nbaqqqq
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:202
专家分:137
注 册:2009-11-6
收藏
得分:0 
娃哈哈~又是cmd啊,>的作用就是转向的吧,网上还有cmd大全,有好多功能呢,但不知道其实用的功能。
对了  我转向完后,找不到tmp.txt文件
2010-02-12 16:09
快速回复:文件的打开函数
数据加载中...
 
   



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

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