还请赵老师,看一下输入输出的问题c、c++

haunying3 2012-05-27 05:31:50

赵老师在
“为什么赵老师说要摒弃cin、cout、fstream;使用scanf、printf、FILE *??”
http://topic.csdn.net/u/20120524/10/23f749c2-1d1d-4aa5-a9e6-a9c288cbfe11.html?5880#replyachor
一帖中:
///////////////////////////////////////////////////////////////////////////////////////////////////////
请问楼主给孩子请保姆你请老老实实知根知底做事靠谱的家人还是请灵活多变时尚靓丽做事不靠谱的小保姆?

谁用c++实现一下和下面C程序功能类似的代码?


#include <stdio.h>
char s[]="123 ab 4";
char *p;
int v,n,k;
void main() {
p=s;
while (1) {
k=sscanf(p,"%d%n",&v,&n);
printf("k,v,n=%d,%d,%d\n",k,v,n);
if (1==k) {
p+=n;
} else if (0==k) {
p++;
} else {//EOF==k
break;
}
}
printf("End.\n");
}
//k,v,n=1,123,3
//k,v,n=0,123,3
//k,v,n=0,123,3
//k,v,n=0,123,3
//k,v,n=1,4,2
//k,v,n=-1,4,2
//End.


///////////////////////////////////////////////////////////////////////////////////////////////////////
现在本人用C++实现如下:(我承认我较真了)

#include <sstream>
#include <iostream>

int main(){
std::istringstream iss("123 ab 4");
int a=int();

while(iss>>a,!iss.eof()){
if(iss.bad()){
std::cout<<"bad"<<std::endl;
break;
}
if(iss.fail()){
std::cout<<"fail"<<std::endl;
iss.clear();
iss.ignore();
continue;
}
std::cout<<a<<std::endl;
}
std::cout<<a<<std::endl;
system("pause");
return 0;
}

个人的感觉用c++io库编写程序就是:
优点-简单明了
缺点-
1、效率低
2、无法进行底层控制-出现的问题
<1>、在linux系统中,读文件(长实现连续读多个文件),开始正常,一段时间(1-3天)后,就出现:无限循环,不是fail、bad、eof这三种情况之一。后来在csdn中发帖问了一下,有人提到是输入缓冲区的问题,我用sync()就好了!
<2>、在windows中读文件,出现文件文件读到一半就终止的现象,上网查了一下,打开文件要加上“std::ios::binary”这个参数。原因是如果不加,windows在底层会做一些转换!

问题一:在c++输入输出中有没有其他(除了上面两点),还有没有其他问题?用c的输入输出是否可以屏蔽上面的问题?
问题二:
在论坛中多次看到
“计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构……”
问,为什么把dos命令放在,计算机组成原理与汇编语言之间?
...全文
671 47 打赏 收藏 转发到动态 举报
写回复
用AI写文章
47 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2012-06-06
  • 打赏
  • 举报
回复
[Quote=引用 46 楼 的回复:]
引用 13 楼 的回复:

我想以下这两个例子应该能说明为什么要先学DOS命令了吧。

system("dir /b /a-d c:\\*.* >d:\\allfiles.txt");
//读文件d:\\allfiles.txt的内容即C:\\下所有文件的名字
system("dir /b /ad c:\\*.* >d:\\alldirs.txt");
//读文件d:\\alldir……
[/Quote]
不妨试试用API遍历一下IE临时文件所在目录比如
"C:\Documents and Settings\Administrator\Local Settings\Temporary Internet Files"
haunying3 2012-06-03
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 的回复:]

我想以下这两个例子应该能说明为什么要先学DOS命令了吧。

system("dir /b /a-d c:\\*.* >d:\\allfiles.txt");
//读文件d:\\allfiles.txt的内容即C:\\下所有文件的名字
system("dir /b /ad c:\\*.* >d:\\alldirs.txt");
//读文件d:\\alldirs.txt的内容即C:\\下……
[/Quote]
使用dos命令的确方便,但效率就低了吧。还有就是,某些涉及权限的操作 用这方法不行吧?
haunying3 2012-06-03
  • 打赏
  • 举报
回复
首先感谢各位回帖!
但请大家不要进行人身攻击啊,发本帖的目的就是让大家讨论一下c、c++ 的io操作问题。
关于dos命令的讨论有点。。。


现在想想大家请教一下:
各位在进行io操作(比如说文件io),都用哪一类函数----c的库函数、c++库函数、还是系统api?
用这些函数都有什么感受,优点有什么?缺点有什么?
到底用哪一类比较好呢?
fallening 2012-06-02
  • 打赏
  • 举报
回复
[Quote=引用 41 楼 的回复:]

引用 31 楼 的回复:

擦灰………… 很好很强大

过儿在德国么?哪个城市?我在 Ulm

我在Bonn~~

赵老师,收起你的忽悠神功吧~~

你的那套骗骗新手还行,遇到我这种死心眼的,你就沉默是金吧~~
[/Quote]
有点远…………
不过如果你过来玩,请客还是请得起的 :)

0176-2869-9276




fzamygsd 2012-06-01
  • 打赏
  • 举报
回复
JamesChen 2012-06-01
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 的回复:]

引用 17 楼 的回复:
忽悠,接着忽悠~~

连DOS和shell都分不清,还好意思大言不惭呢~~

你还是去擦擦灰吧~~

我算命算出你早晚要去擦灰的。
[/Quote]

唉 虽说以前我也用别的ID狂喷过你 不过现在看看 你还是挺可怜的。。。
独孤过儿 2012-06-01
  • 打赏
  • 举报
回复
哈哈,少跟我打太极转移话题,我不吃这一套~~

我打击你是打击你的,但还是很客观的评价你的能力

偶专门翻过一些你的回帖,个人判断你是个中等偏上水平的人。但你绝对不熟悉你总贴的微机原理,系统架构

以及汇编语言这些。所以偶很不满的是:你自己都不熟悉这些,就告诉别人猛钻,无论别人搞啥的,你都告诉

人家研究这些东西,这是一种变相的坑人了!你要晓得,你的一句随随便便不负责任的话,很可能让许许多多

的学生多走不少的弯路。我当年上学那会,就被一些拉大旗扯虎皮的所谓老师们坑过,深有体会也深恶痛疾!

假如你只是踏踏实实的回你懂的贴,偶还是很支持你的,我们当年也都这么热心过!
赵4老师 2012-06-01
  • 打赏
  • 举报
回复
Bonn的灰尘是比Beijing少多了。
独孤过儿 2012-06-01
  • 打赏
  • 举报
回复
[Quote=引用 31 楼 的回复:]

擦灰………… 很好很强大

过儿在德国么?哪个城市?我在 Ulm
[/Quote]
我在Bonn~~

赵老师,收起你的忽悠神功吧~~

你的那套骗骗新手还行,遇到我这种死心眼的,你就沉默是金吧~~

cryingbee 2012-06-01
  • 打赏
  • 举报
回复
很少听说在正规产品里调dos命令,而不调标准API的。。。

调dos命令缺少交互,效率又低,一般只是在测试例程或者一些周边小工具里用。
赵4老师 2012-06-01
  • 打赏
  • 举报
回复
[Quote=引用 37 楼 的回复:]
其实“活药味”有时只是一种“包装”和“炒作”而已。(^_^)
[/Quote]
活药味→火药味
赵4老师 2012-06-01
  • 打赏
  • 举报
回复
[Quote=引用 38 楼 的回复:]
楼主的这一行是什么意思,我不明白:
k=sscanf(p,"%d%n",&v,&n);

sscanf返回的k代表什么?%n又是什么意思?你确认是这样写吗?
[/Quote]
查MSDN是Windows程序员必须掌握的技能之一。

mk:@MSITStore:D:\MSDN98\98VS\2052\vccore.chm::/html/_crt_scanf.2c_.wscanf.htm
scanf, wscanf
Read formatted data from the standard input stream.

int scanf( const char *format [,argument]... );
...
Return Value

Both scanf and wscanf return the number of fields successfully converted and assigned; the return value does not include fields that were read but not assigned. A return value of 0 indicates that no fields were assigned. The return value is EOF for an error or if the end-of-file character or the end-of-string character is encountered in the first attempt to read a character.

mk:@MSITStore:D:\MSDN98\98VS\2052\vccore.chm::/html/_crt_scanf_type_field_characters.htm
scanf Type Field Characters
...
%n No input read from stream or buffer. Pointer to int, into which is stored number of characters successfully read from stream or buffer up to that point in current call to scanf functions or wscanf functions.
fallening 2012-06-01
  • 打赏
  • 举报
回复
擦灰………… 很好很强大

过儿在德国么?哪个城市?我在 Ulm
ljhhh0123 2012-06-01
  • 打赏
  • 举报
回复
楼主的这一行是什么意思,我不明白:
k=sscanf(p,"%d%n",&v,&n);

sscanf返回的k代表什么?%n又是什么意思?你确认是这样写吗?

赵4老师 2012-06-01
  • 打赏
  • 举报
回复
其实“活药味”有时只是一种“包装”和“炒作”而已。(^_^)
某大一菜鸟 2012-06-01
  • 打赏
  • 举报
回复
怎么火药味这么重==
FrankHB1989 2012-06-01
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 的回复:]

忽悠,接着忽悠~~

连DOS和shell都分不清,还好意思大言不惭呢~~

你还是去擦擦灰吧~~
[/Quote]
shell不见得是UNIX shell。MS-DOS的UI可以算是shell。
因此把DOS命令/cmd解释的命令说成shell命令也可以不算错。
WinNT下说DOS命令倒不是很恰当,因为不见得使用DOS子系统,命令集也不完全相同。
当然拿DOS统称CLI就缺心眼了。

haunying3 2012-05-29
  • 打赏
  • 举报
回复
怎么我发的帖子就人少呢?大家都来聊聊这个问题啊!
独孤过儿 2012-05-29
  • 打赏
  • 举报
回复
很明显,是因为新手,容易 把各种shell命令,统称为 dos命令。

所以,为了面向新手的通俗易懂,不堆砌专业术语, zhao4zhong1 刻意把shell命令等统称为 dos命令。
-------------------------------------------------------
请问阁下,您在刚学说话的时候,分不清饭碗和马桶的时候,你家长会为了通俗易懂,告诉你所有圆形的东西都叫马桶或者都叫饭碗吗?
学东西要脚踏实地,一步一个脚印的来,总是试图不懂装懂,蒙混过关,最后总是搬起石头砸自己的脚!还找些客观理由,不堆砌专业术语,他说的东西都极少有专业的,还好意思谈专业?不丢人吗



内存出问题,需要扫灰,也是很常见的。过去早期年代的电脑,用得年代久远,积很多灰,的确容易蓝屏或者内存不能read。
要是普通的内存,能确保硬件不出问题,那又何须reg-ecc内存?机房又何须避免灰尘?
--------------------------------------------------------------------
几个问题:
1、您说的早期年代,早到什么年代呀?现在又是什么年代呀?现在年代出的事,您拿早些年的经验硬套,这叫啥?早些年交通工具是马车,坐轿呢,你现在咋不骑马坐轿了呢?

2、很显然你是抬杠,需要扫灰不等于所有的问题都是灰尘引起的,明白?引用一个老郭的相声,买方便面去被车撞死了,这事情的几率确实有。但你能说所有被车撞死的人,都是去买方便面的吗?
CandPointer 2012-05-29
  • 打赏
  • 举报
回复
很明显,是因为新手,容易 把各种shell命令,统称为 dos命令。

所以,为了面向新手的通俗易懂,不堆砌专业术语, zhao4zhong1 刻意把shell命令等统称为 dos命令。



内存出问题,需要扫灰,也是很常见的。过去早期年代的电脑,用得年代久远,积很多灰,的确容易蓝屏或者内存不能read。
要是普通的内存,能确保硬件不出问题,那又何须reg-ecc内存?机房又何须避免灰尘?
加载更多回复(26)

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧