Прочитать файл строк с кавычками и запятыми в массив строк

0

Скажем, у меня есть файл имен, таких как:

"erica","bosley","bob","david","janice"

То есть, кавычки вокруг каждого имени, каждое имя разделяется запятой без пробела между ними.

Я хочу прочитать их в массиве строк, но, похоже, не может найти работу ignore/get/getline/whatever. Я предполагаю, что это распространенная проблема, но я пытаюсь улучшить работу с файлами ввода/вывода и пока не знаю. Вот базовая версия, которая просто читает во всем файле как одну строку (НЕ то, что я хочу, очевидно):

#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
    std::string инициализируется пустой строкой, когда у нее нет другого инициализатора.
  • 0
    Если бы это был я, я бы find_first_of входные данные в одну строку, а затем написал бы цикл, включающий find_first_of чтобы вручную find_first_of строку. Но, может быть, я старая школа?
Показать ещё 2 комментария
Теги:
string
arrays
file-io

2 ответа

6
Лучший ответ

Самый простой способ справиться с этим:

  1. Прочитайте весь файл и поместите его в строку. Вот пример того, как это сделать.
  2. Разделите строку, полученную с номера 1. Вот пример того, как это сделать.
  • 0
    Вау, никогда бы не догадался, что это лучший способ. Спасибо!
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;
}

Живой пример

Ещё вопросы

Сообщество Overcoder
Наверх
Меню