c readfile с различным количеством элементов в строке?

#c #readfile

#c #readfile

Вопрос:

если у меня есть такой файл, скажем, вызывается file.txt

 20  
25  97
97  5

  

Как мне правильно прочитать его, учитывая, что во втором столбце отсутствует второй элемент в первой строке?Я попытался это

 int main()
{

    ifstream readFile;
    string filename;
    cout << "Please enter file name and extention: " << endl;
    cin >> filename;
    readFile.open(filename);

        int row = 0;
        int column = 0;

    while (readFile >> row >> column)
    {
//does something
}
  

Однако я получаю ошибку сегментации

Комментарии:

1. Полностью зависит от того, что вы подразумеваете под словом «правильно». Что вы ожидаете, когда одно из чисел отсутствует?

Ответ №1:

Я хотел бы использовать std::getline для чтения строк и std::stringstream анализа строк.

 #include <iostream>
#include <fstream>
#include <sstream>

int main(void) {
    std::string filename;
    std::string line;
    std::ifstream readFile;
    std::cout << "Please enter file name and extention: " << std::endl;
    std::cin >> filename;
    readFile.open(filename);
    if (!readFile) {
        std::cout << "open errorn";
        return 1;
    }

    while (std::getline(readFile, line)) {
        std::stringstream ss(line);
        int row = 0, column = 0;
        if (ss >> row >> column) {
            std::cout << "row = " << row << ", column = " << column << 'n';
        } else {
            std::cout << "invalid linen";
        }
    }

    readFile.close();
    return 0;
}
  

Другая версия (также печатает частичную строку):

 #include <iostream>
#include <fstream>
#include <sstream>

int main(void) {
    std::string filename;
    std::string line;
    std::ifstream readFile;
    std::cout << "Please enter file name and extention: " << std::endl;
    std::cin >> filename;
    readFile.open(filename);
    if (!readFile) {
        std::cout << "open errorn";
        return 1;
    }

    while (std::getline(readFile, line)) {
        std::stringstream ss(line);
        int row = 0, column = 0;
        bool row_valid = false, column_valid = false;
        if (ss >> row) row_valid = true;
        if (ss >> column) column_valid = true;
        std::cout << "row = ";
        if (row_valid) std::cout << row; else std::cout << "(none)";
        std::cout << ", column = ";
        if (column_valid) std::cout << column; else std::cout << "(none)";
        std::cout << 'n';
    }

    readFile.close();
    return 0;
}
  

Еще одна версия (поддержка строк с 3 целыми числами и более):

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

int main(void) {
    std::string filename;
    std::string line;
    std::ifstream readFile;
    std::cout << "Please enter file name and extention: " << std::endl;
    std::cin >> filename;
    readFile.open(filename);
    if (!readFile) {
        std::cout << "open errorn";
        return 1;
    }

    while (std::getline(readFile, line)) {
        std::stringstream ss(line);
        std::vector<int> lineInts;
        int data;
        while (ss >> data) lineInts.push_back(data);
        std::cout << lineInts.size() << " elements:";
        for (int d : lineInts) std::cout << ' ' << d;
        std::cout << 'n';
    }

    readFile.close();
    return 0;
}
  

Комментарии:

1. что, если я все еще хочу прочитать недопустимую строку? Скажем, строка = 20 столбцов = пусто

2. @davidlingg2000 добавил эту версию.