首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

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

2012-06-07 
还请赵老师,看一下输入输出的问题c、c++赵老师在“为什么赵老师说要摒弃cin、cout、fstream;使用scanf、printf、

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

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

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

C/C++ code
#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++实现如下:(我承认我较真了)
C/C++ code
#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命令放在,计算机组成原理与汇编语言之间?


[解决办法]
大概赵老师年轻的时候,DOS是常用系统。
(或者,他通俗地把各种shell命令(包括linux,awk之类),统称“DOS”命令,以便新人明白。)
所以,DOS命令。需要学



还有一直到XP初期,各种工具少,很多人习惯把系统盘,分为FAT32.

常常遇到 超频后,蓝屏,然后重启,XP、启动提升,缺少某 dll,启动失败。
然后,就得 DOS, xcpoy之类的

有时候,还要光盘启动,命令提示符下, fixboot, fixmbr之类的命令。
[解决办法]
xp中期, ERD command, 类似 PE系统流行了, dos就用得少了。

win 98时期,更是 有进入dos实模式选项
[解决办法]
楼上的抢了赵老师的风头啊。
[解决办法]
诶,现在的DOS。。。。。

诶。。还是别学了,,学神马DOS啊
[解决办法]
你用就用, 没人拦着你, 估计你是不是linux开发的, 所以不知道FILE和fd之间的互动很频繁。
[解决办法]
呃,顶一下,希望有人能解决楼主疑问..
[解决办法]
楼主帖子明显比我那个小白贴更有水平啊,希望有人能为楼主释疑..
探讨
怎么我发的帖子就人少呢?大家都来聊聊这个问题啊!

[解决办法]
C/C++ code
#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) {            printf("skip char[%c]\n",p[0]);            p++;        } else {//EOF==k            break;        }    }    printf("End.\n");}//k,v,n=1,123,3//k,v,n=0,123,3//skip char[ ]//k,v,n=0,123,3//skip char[a]//k,v,n=0,123,3//skip char[b]//k,v,n=1,4,2//k,v,n=-1,4,2//End. 


[解决办法]
我想以下这两个例子应该能说明为什么要先学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:\\下所有子目录的名字
请记住,能用shell命令获取文件、文件夹信息或者操作文件、文件夹最好用shell命令获取或者操作,而不要用各种API获取或者操作,因为当遇到非法文件夹名或非法文件名或非法文件长度、非法文件日期、压缩文件、链接文件、稀疏文件……等各种意料之外的情况时,API会处理的不全面或陷入死循环,而shell命令不会。

C/C++ code
#include <windows.h>#include <stdio.h>char cmdstr[256];int i;int YN(int k) {    FILE *f;    char fn[40];    char ln[80];    int yn=0;    sprintf(fn,"d:\\ping%d.txt",k);    f=fopen(fn,"r");    if (NULL!=f) {        fgets(ln,80,f);        fgets(ln,80,f);        fgets(ln,80,f);        if (1==fscanf(f,"Re%c",&yn)) yn='q'-yn;        fclose(f);        unlink(fn);    }    return yn;}void main() {    for (i=115;i<130;i++) {        sprintf(cmdstr,"cmd /c ping 192.168.2.%d -n 1 -w 1000 >d:\\ping%d.txt",i,i);        WinExec(cmdstr,SW_HIDE);    }    Sleep(3000);    for (i=115;i<130;i++) {        printf("%d 192.168.2.%d\n",YN(i),i);    }}//1 192.168.2.115//0 192.168.2.116//0 192.168.2.117//0 192.168.2.118//1 192.168.2.119//0 192.168.2.120//0 192.168.2.121//0 192.168.2.122//1 192.168.2.123//0 192.168.2.124//0 192.168.2.125//1 192.168.2.126//0 192.168.2.127//1 192.168.2.128//0 192.168.2.129
[解决办法]
C/C++ code
#include <stdio.h>#define BUF_LEN 1024#define EMAIL_LEN 80#define QUOTE1(q) #q#define QUOTE(q) QUOTE1(q)char s[]="\"单身\"<760026313@qq.com>; \"XXD\"<502144951@qq.com>; \"凤凰\"<542307112@qq.com>;\"\" <111@qq.com>;\"\" <222@sina.com.cn>;\"\" <333@yahoo.com>;";char *p,*q;int n,k;char e[EMAIL_LEN];char b[BUF_LEN];void main() {    p=s;    q=b;    while (1) {        if (1==sscanf(p,"%*[^<]<%"QUOTE(EMAIL_LEN)"[^>]>%n",e,&n)) {            p+=n;            k=sprintf(q,"%s|",e);            q+=k;            if (q-b>BUF_LEN-EMAIL_LEN) break;        } else break;    }    q[-1]=0;//去掉末尾的|    printf("%s\n",b);}//760026313@qq.com|502144951@qq.com|542307112@qq.com|111@qq.com|222@sina.com.cn|333@yahoo.com
[解决办法]
用api比系统调用好
理由是出错的时候api可以通过返回值捕捉, 系统调用只能输出到文件, 然后再解析文件

[解决办法]
很少听说在正规产品里调dos命令,而不调标准API的。。。

调dos命令缺少交互,效率又低,一般只是在测试例程或者一些周边小工具里用。
[解决办法]
楼主的这一行是什么意思,我不明白:
k=sscanf(p,"%d%n",&v,&n);

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


[解决办法]
探讨
楼主的这一行是什么意思,我不明白:
k=sscanf(p,"%d%n",&amp;v,&amp;n);

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

[解决办法]
哈哈,少跟我打太极转移话题,我不吃这一套~~

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

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

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

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

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

假如你只是踏踏实实的回你懂的贴,偶还是很支持你的,我们当年也都这么热心过!

热点排行