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

Read a file of strings with quotes and commas into string array

本文关键字:字符串 文件 数组      更新时间:2023-10-16

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

"erica","bosley","bob","david","janice"
也就是说,每个名称

两边用引号引起来,每个名称用逗号分隔,中间没有空格。

我想将这些读入字符串数组,但似乎找不到忽略/获取/获取/获取线/任何组合来工作。 我想这是一个常见问题,但我正在努力在文件 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

最简单的处理方法:

  1. 读取整个文件并将其放入字符串中,这是如何执行此操作的示例。
  2. 拆分从数字 1 获得的字符串。下面是如何执行此操作的示例。

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

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

现场示例