#c #vector #readfile
#c #вектор #readfile
Вопрос:
Цель этой программы — прочитать текстовый файл и сохранить его содержимое в 3 отдельных векторах.
Текстовый файл, называемый «InsultsSource.txt «, содержит 50 строк столбцов прилагательных, разделенных табуляцией, которые выглядят следующим образом:
happy sad angry
tired mad hungry
Ниже приведен код, который я использую для достижения этой цели. По какой-то причине все работает до 16-й строки, после чего возвращаются пустые пробелы. Я проверил текстовый файл, чтобы узнать, изменился ли там формат, но он выглядит нормально. Мне просто интересно, есть ли какая-либо ошибка в моей логике / коде, которая вызывает эту проблему.
#include <vector>
#include <string>
#include <fstream>
#include <iostream>
using namespace std;
int main() {
ifstream fileIn("InsultsSource.txt");
vector<string> col1;
vector<string> col2;
vector<string> col3;
string word;
if (fileIn.fail()) {
cerr << "Unable to open file" << endl;
}
for (int i = 0; i < 50; i ) {
if (i % 3 == 0) {
getline(fileIn, word, 't');
col1.push_back(word);
}
else if (i % 3 == 1) {
getline(fileIn, word, 't');
col2.push_back(word);
}
else {
getline(fileIn, word);
col3.push_back(word);
}
}
for(int j = 0; j < 50; j ) {
cout << j 1 << " " << col1[j] << endl;
//cout << "Thou " << col1[j] << " " << col2[j] << " " << col3[j] << "!" << endl;
}
return 0;
}
Комментарии:
1. Вы предполагаете, что в файле 50 записей. Лучший алгоритм — читать, пока в файле есть данные.
2. Не вызывает ли второй
for
цикл (содержащийj
иcout
) сбой, когда вы перебираете границу массива?3. @ThomasMatthews Вы правы. Я просто подумал, что, поскольку я просто пытаюсь заставить это работать, и я знаю, что есть 50 строк, это не повредит.
4. @UnholySheep В каждом столбце должно быть 50 записей, поэтому я не уверен, почему вы думаете, что это приведет к сбою.
5. Вы видите, сколько времени вы сэкономили с помощью этого ярлыка?
Ответ №1:
Вы читаете всего 50 слов, затем пытаетесь напечатать 50 слов из каждого столбца.
Комментарии:
1. Да, это был кикер. Большое спасибо, избавил меня от большой головной боли.
Ответ №2:
Избавьтесь от for
цикла, используйте while
вместо:
std::string text;
while (std::getline(fileIn, text, 't'))
{
col1.push_back(text);
std::getline(fileIn, text, 't');
col2.push_back(text);
std::getline(fileIn, text);
col3.push_back(text);
}
Это может быть случай, когда вы хотите смоделировать каждую строку со структурой.
struct Record
{
std::string col1;
std::string col2;
std::string col3;
}
std::vector<Record> database;
Record r;
while (std::getline(fileIn, r.col1, 't')
{
std::getline(fileIn, r.col2, 't');
std::getline(fileIn, r.col3);
database.push_back(r);
}
Комментарии:
1. Вау, я очень ценю ваш комментарий. Я знаю, что мой код был не самым элегантным, но я всегда ищу способы улучшения.
Ответ №3:
Скорее используйте что-то вроде
std::string val1, val2; val3;
vector<string> col1;
vector<string> col2;
vector<string> col3;
while(fileIn >> val1 >> val2 >> val3) {
col1.push_back(val1);
col2.push_back(val2);
col3.push_back(val3);
}