关于c ++:将带引号和逗号的字符串文件读入字符串数组

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号得到的字符串。下面是一个如何做到这一点的例子。

  • 流提取以空格分隔。因此,整个文件被读取为一个字符串。您需要的是用逗号分隔字符串。

    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);
    }

    remove_if返回转换字符串的end迭代器,这就是为什么用(s.begin(), it)构造新字符串的原因。

    然后输出:

    1
    2
    3
    for (unsigned int i = 0; i < names.size(); i++) {
        std::cout <<"names["<<i<<"]:" << names[i] << std::endl;
    }

    活生生的例子