C ++ fstream: get () пропуская первую и последнюю строку - PullRequest
1 голос
/ 09 марта 2020

Я читаю из файла целых чисел, преобразовываю каждый элемент в файле в целое число и добавляю целое число к вектору векторов, если файл перемещается на новую строку, вектор векторов перемещается в новый вектор , Например, если входной файл содержит:

9
2 5 8
7 1 10
5 3
20 15 30
100 12

Вектор векторов должен содержать:

[ [9],
  [2, 5, 8],
  [7, 1, 10],
  [5, 3],
  [20, 15, 30],
  [100, 12] ]

Однако проблема с моей реализацией заключается в том, что он хранит:

[ [2, 5, 8],
  [7, 1, 10],
  [5, 3],
  [20, 15, 30] ]

Использование кода для вывода:

2 5 8
7 1 10
5 3
20 15 30

Код:

#include <iostream>
#include <vector>
#include <fstream>

using namespace std;

int main() {
    ifstream inputFile("input.txt"); // Opens input file.

    char currentChar;
    int currentInput = 0;
    vector<vector<int>> vec;
    vector<int> vec2;

    while (inputFile.get(currentChar)) { // Reads each character of given file.

        if (currentChar == '\n') { // If current character is a new line, store current vec2 in vec and clear vec2
            vec.push_back(vec2);
            vec2.clear();
        }

        inputFile >> currentInput; // Current character to integer
        vec2.push_back(currentInput); // Adds current integer to vec2

    }
    vec2.clear();
    inputFile.close();

    for (const auto& inner : vec) { // Prints vector of vectors.
        for (auto value : inner) {
            cout << value << " ";
        }
        cout << endl;
    }
}

Любые предложения о способах решения этой проблемы очень помогут.

Ответы [ 3 ]

1 голос
/ 09 марта 2020

Я использовал std::istream::getline для обработки файла строка за строкой. Попробуйте,

#include <iostream>

#include <string>
#include <vector>

#include <fstream>
#include <sstream>

int main(int , char *[]){

    std::ifstream stream("input.txt");
    std::istringstream other("");

    int i = 0;
    char buffer[100] = {};

    std::vector<std::vector<int>> data;
    std::vector<int> vec;

    stream.getline(buffer, 100);

    while(stream.gcount() > 1){
        other.clear();
        other.str(buffer);

        while (other >> i) {
            vec.push_back(i);
        }

        if(!vec.empty()){
            data.push_back(std::move(vec));
        }

        stream.clear();
        stream.getline(buffer, 100);
    }

    for(const auto& ele: data){
        std::cout<< "[ ";
        for(int vecEle: ele){
            std::cout<< vecEle<< " ";
        }
        std::cout<< "]\n";
    }
}

вывод:

[ 9 ]
[ 2 5 8 ]
[ 7 1 10 ]
[ 5 3 ]
[ 20 15 30 ]
[ 100 12 ]
1 голос
/ 09 марта 2020

Исправлено, меняя время от времени l oop.

while (!inputFile.eof()) {

    inputFile >> currentInput;

    vec2.push_back(currentInput);

    if (inputFile.peek() == '\n') {
        vec.push_back(vec2);
        vec2.clear();
    }
}

У меня были проблемы с поиском следующей строки. Это было исправлено с помощью функции peek, чтобы найти '\ n'.

0 голосов
/ 09 марта 2020
while (!inputFile.eof(0)) {

    inputFile >> currentInput;

    vec2.push_back(currentInput);

    if (inputFile.peek() == '\n') {
        vec.push_back(503);
        vec2.clear();
    }
}
...