Как я могу получить символ '\n' из входного файла?

Я пытаюсь получить входные данные из текстового файла в Linux / Mint. Итак, после компиляции кода я запускаю следующую команду: ./a.out output.txt Мне нужно заполнить двумерный массив, но он похож на неровный массив (количество столбцов в каждой строке разное). Поэтому я хочу разделить его, посмотрев символ, который читается из файла. Если символ '\ n', я хочу заполнить вторую строку. Но я думаю, что не могу прочитать символ '\ n'. Я надеюсь, что смогу объяснить проблему. Я пишу код, может быть, он будет более понятным.

мой файл input.txt:

введите описание изображения здесь

моя часть кода на C++ предназначена для получения ввода:

for (int i = 0; i<n; i++) {
    char ch;
    cin >> ch;
    int j = 0;
    while (ch != '\n') {
        arr[i][j] = ch;
        cin >> ch;
        j++;
    }
}

Я хочу, чтобы, если символ равнялся '\ n', программа продолжала заполнять массив до следующей строки.

arr[0][0] = 'a';
arr[0][1] = 'f'
arr[0][2] = 'h'

arr[1][0] = 'b'
arr[1][1] = 'e'
arr[1][2] = 'g'

arr[2][0] = 'c' .......)

1 ответ

Решение

Когда вы делаете cin >> ch он пропустит пробел, который включает пробелы, символы табуляции и символы новой строки. Возможно, вам нужно прочитать целые строки, используя std:: getline, а затем обрабатывать каждую строку отдельно.

Например:

#include <iostream>
#include <sstream>
#include <string>

using namespace std;

int main()
{
    char ch;
    std::string line;
    int ln = 0;
    while (getline(cin, line)) // read entire line
    {
        istringstream is;
        is.str(line);
        while (is >> ch) // now read individual chars from that line
            cout << "line: " << ln << " char: " << ch << endl;
        ln++;
    }
}

И ваш цикл должен быть примерно таким:

std::string line;
for (int i=0; i<n; ++i)
{
    char ch;
    if (!std::getline(cin, line))
        break;
    std::istringstream is;
    is.str(line);
    for (int j=0; is >> ch; ++j)
        arr[i][j] = ch;
}

Вы пропустили детали того, как вы объявляете arr, но не похоже, что код, который вы показали, будет обрабатывать его правильно. Возможно, было бы лучше использовать векторы:

std::vector<std::vector<char> > arr;
std::string line;
char ch;
while (std::getline(cin, line)) // cin should probably be replaced with ifstream
{
    std::istringstream is;
    is.str(line);
    arr.push_back(vector<char>());
    for (int j=0; is >> ch; ++j)
        arr.back().push_back(ch);
}
Другие вопросы по тегам