Скажем, у меня есть файл имен, таких как:
"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
Извлечение потока ограничивает пространство. Поэтому весь файл читается как одна строка. Вместо этого вы должны разбить строку запятыми.
#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;
}
std::string
инициализируется пустой строкой, когда у нее нет другого инициализатора.find_first_of
входные данные в одну строку, а затем написал бы цикл, включающийfind_first_of
чтобы вручнуюfind_first_of
строку. Но, может быть, я старая школа?