Read a file of strings with quotes and commas into string array
假设我有一个文件名,比如:
1 | "erica","bosley","bob","david","janice" |
也就是说,在每个名称周围加引号,每个名称之间用逗号分隔,中间没有空格。
我想把它们读入一个字符串数组,但似乎找不到ignore/get/getline/whatever组合。我认为这是一个常见的问题,但我正在努力改进文件I/O,而且还不太了解。下面是一个基本版本,它只将整个文件作为一个字符串读取(显然不是我想要的):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | #include <iostream> #include <fstream> #include <string> using namespace std; fstream iFile("names.txt", ios::in); string names[5]; int index = 0; while(iFile) { iFile >> names[index]; index++; } for(int i = 0; i < 5; i++) { cout <<"names[" << i <<"]:" << names[i] << endl; } |
输出:
1 2 3 4 5 | names[0]:"erica","bosley","bob","david","janice" names[1]: names[2]: names[3]: names[4]: |
另外,我理解为什么所有的元素都被读取为一个字符串,但是为什么其余的元素没有被垃圾填充呢?
为了清楚起见,我希望输出如下所示:
1 2 3 4 5 | names[0]: erica names[1]: bosley names[2]: bob names[3]: david names[4]: janice |
最简单的处理方法是:
流提取以空格分隔。因此,整个文件被读取为一个字符串。您需要的是用逗号分隔字符串。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | #include <iostream> #include <fstream> #include #include <sstream> fstream iFile("names.txt", ios::in); string file; iFile >> file; std::istringstream ss(file); std::string token; std::vector<std::string> names; while(std::getline(ss, token, ',')) { names.push_back(token); } |
要删除引号,请使用以下代码:
1 2 3 4 | for (unsigned int i = 0; i < names.size(); i++) { auto it = std::remove_if(names[i].begin(), names[i].end(), [&] (char c) { return c == '"'; }); names[i] = std::string(names[i].begin(), it); } |
然后输出:
1 2 3 | for (unsigned int i = 0; i < names.size(); i++) { std::cout <<"names["<<i<<"]:" << names[i] << std::endl; } |
活生生的例子