假设我有一个名称文件,例如:
"erica","bosley","bob","david","janice"
即,每个名称周围都有引号,每个名称用逗号分隔,中间没有空格。
我想把这些读成一个字符串数组,但似乎无法找到ignore / get / getline /无论使用什么组合。我想这是一个常见的问题,但我正试图在文件I / O上做得更好而且还不太了解。这是一个基本版本,它只是将整个文件作为一个字符串读取(显然不是我想要的):
#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;
}
输出:
names[0]: "erica","bosley","bob","david","janice"
names[1]:
names[2]:
names[3]:
names[4]:
另外,我理解为什么它全部被读作单个字符串,但为什么剩下的元素没有被垃圾填满?
要清楚,我希望输出看起来像:
names[0]: erica
names[1]: bosley
names[2]: bob
names[3]: david
names[4]: janice
答案 0 :(得分:6)
答案 1 :(得分:0)
流提取由空格分隔。因此整个文件被读取为一个字符串。你想要的是用逗号分割字符串。
#include <iostream>
#include <fstream>
#include <algorithm>
#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);
}
要删除引号,请使用以下代码:
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);
}
remove_if
返回已转换字符串的end
迭代器,这就是您使用(s.begin(), it)
构造新字符串的原因。
然后输出:
for (unsigned int i = 0; i < names.size(); i++) {
std::cout << "names["<<i<<"]: " << names[i] << std::endl;
}