标签:如何 fstream 排序 类型转换 传参 log 文件 ack ble
后续在做题时的时候遇到了一个从文件里去读取一串逗号分隔的double数字,并排序的问题;
还是挺操蛋的一道题,用直接读入在分割的方法贼麻烦,所以还是要寻求简单的的库函数和Cpp11特性来进行解决;
查阅相关blog,简单聊一下相关的问题;
其实最主要的有两个问题:
1.如何读入?能不能一次分割得到string;
2.如果将存放小数的string转换成double;
其一:利用getline的重载形式,这是自己第一次见;
以前getline(cin,s),只是简单的读入一行,但是其还有另一种形式getline(cin,s,char),其中char就是读入的终止符,如果不写默认情况下就是换行符;
所以可以直接利用这个在对文件读入的时候直接做文章;
while (getline(fin,s,‘,‘)){ dl.push_back(stod(s)); }
这段代码有两个要点:
1.getline套在while循环里直接进行读入文件尾部判定;
2.对读入的文件利用‘,’进行分割;
其二:利用古老的C函数,stroke()进行处理;
这种方法极其操蛋,不到万不得已我觉得还是别用的好,涉及很多自己以前c语言没怎么用过的东西;
while (getline(fin,s)){ char* c = (char*)malloc((s.size()) * sizeof(char)); strcpy(c, s.c_str()); cout << s << endl; cout << c << endl; char *pc = strtok(c, ","); while (pc != NULL) { string ss = pc; dl.push_back(stod(ss)); pc = strtok(NULL, ","); } }
strtok接受两个参数,第一个是数组指针char* c,第二个是一个char* de,传递需要分割的中间符号;
在传参执行成功后,传回第一个分割字符串的首地址;
后续反复调用strtok(NULL,char* de),则会一直返回指向后续分割字符串的指针,可以循环直到返回指针为空,此时分割完毕;
重要补充:
在之前刷题中,往往能见到按照空格进行分割的题目,但是往往自己都是按照字符串遍历进行截取输出,这样其实大可不必;
利用stringstream即可;
stringstream在iostream头文件中,可以利用字符串进行流的输入输出模拟,并且输出的时候可以按照空格进行割裂,割裂成好几个字符串;
while (getline(fin,s)){ stringstream ss(s); string s1; while (ss >> s1) { dl.push_back(stod(s1)); //cout << s1<<endl; } }
初始化和fstream类似,直接初始化,模拟输出即可。由于stringstream模仿的是流,所以向string输入字符也要类似于cin>>s;
又涉及到string和int、double、char* 之间的转换问题;
针对于string转int、double:
这是一个牛皮的转换,第一次见。。。
string s; cin >> s; stringstream ss(s);
double d; ss >> d;
本质上和之前的stringstream模拟流输入一毛一样,当定义double类型的时候,直接可以利用流输入,使得系统自己识别出来这是个double数字,这个同理;
或者直接直接利用string库函数:
stod(string); stoi(string);
直接可以将string转换为int和double;
针对于int和double转string;
直接利用to_string()函数即可;
s = to_string(d);
其中d可以为int或者double;
针对于string,char*,char[]:
string转char[],将string.c_str(),转为char*,利用strcpy进行赋值,但是char*要事先用malloc开空间;
char*和char[]对string进行赋值,直接两者等于号赋值即可;
C++ 关于字符串的特殊读入和分割问题 *非常重要,基本囊括string相关的输入输出和类型转换问题
标签:如何 fstream 排序 类型转换 传参 log 文件 ack ble
原文地址:https://www.cnblogs.com/songlinxuan/p/12370059.html