将带引号和逗号的字符串文件读入字符串数组

时间:2013-12-21 04:47:34

标签: c++ arrays string file-io

假设我有一个名称文件,例如:

"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

2 个答案:

答案 0 :(得分:6)

处理此问题的最简单方法:

  1. 阅读整个文件并将其放入字符串中,Here是一个如何操作的示例。
  2. 拆分从数字1开始的字符串。Here是如何执行此操作的示例。

答案 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;
}

Live Example