看一个小案例,怎么从文本文件中读取内容,并将读到的数字行,保持为数字,读到的字符串,保存为字符串。
比如有一个文件donation.txt
,里面的内容是:
4
Sam Stone
2000
Freida Flass
100500
Tammy Tubbs
5000
Rich Raptor
55000
这种要怎么读呢? 怎么处理这种混合的输入?
我是全部按照字符去读取的,然后将每行存到一个字符串中,整体存到一个vector
中,然后再遍历vector
,去判断每行是字符串还是数字,然后分别去处理。其实我没有判断。
从c++
的角度看,这当然不能算是好的处理方式,因为完全没有考虑内存,这样做肯定消耗的内存比较大。
下面是我的实现:
#include <iostream>
#include <fstream>
#include <array>
#include <vector>
#include <sstream>
using namespace std;
int main() {
ifstream inFile;
inFile.open("donation.txt");
char *line = new char[100];
string li;
char ch;
int pos = 0;
vector<string> lines;
while (inFile && inFile.get(ch)) {
if (ch == '\n') {
line[pos] = '\0';
li = line;
// cout << "\nline: " << li << endl;
pos = 0;
lines.push_back(li); // 将文件按行存
continue;
}
line[pos] = ch;
li[pos] = ch;
// cout << ch;
pos++;
}
line[pos] = '\0';
li = line;
if (li.size() > 0)
lines.push_back(li);// 将文件按行存--最后一行
// 最后一行没有回车就会>0,否则是空行,不要存
inFile.close();
cout << "result:\n";
int num = 0;
double donate = 0;
string name;
for (unsigned int i = 0; i < lines.size(); ++i) {
basic_string<char, char_traits<char>, allocator<char>> &item = lines.at(i);
// cout << item << endl;
stringstream ss(item);
if (i == 0) {
ss >> num; // string 2 int
} else if (i % 2 != 0) {
// ss >> name;
name = item;
} else if (i % 2 == 0) {
ss >> donate; // string 2 double
}
}
cout << num << "," << name << "," << donate << endl;
delete[]line;
return 0;
}
输出如下:
4,Rich Raptor,55000
通过输出可以看到,已经完成了将文本文件全部读取,并按行存到vector
中了,然后也顺利地解析了数字的字符串。(考虑到健壮性,应该加判断的,这里不加了。)