还请赵老师,看一下输入输出的问题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程序功能类似的代码?
#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.#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;}#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命令不会。
#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
[解决办法]
#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又是什么意思?你确认是这样写吗?
[解决办法]