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

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