Как мне прочитать текст в 2D-массив более крупных параметров, чем текст (в 2D-массиве больше строк и столбцов), используя object.get ()?

0

Я пытаюсь прочитать текстовый файл символов в массив символов (char array [MAX_ROW] [MAX_COL]), а текстовый файл имеет меньше строк и столбцов, чем массив символов. Это приводит к проблеме чтения материала вещества, находящегося в текстовом файле. Я сталкиваюсь с этой проблемой, когда читаю с использованием следующего метода:

ifstream whiteboard; //ifstream object for reading from a file.
    whiteboard.open(board_name.c_str());

    for(int i = 0; i < MAXROW; i++){ //naive read for canvas, not considering the /n characters or the size of the image.txt
        for(int j = 0; j < MAXCOL; j++){ //for this to store the print properly it must be the exact size of the image dimensions
                canvas[i][j] = whiteboard.get();
            if(whiteboard.get() == '/n'){
               return;
            }
            else if(whiteboard.get() != '/n'){
            canvas[i][j] = whiteboard.get();
            }
        }
    }

    whiteboard.close();

Вышеприведенный код должен проходить через массив 2d только до точки, где находится символ "/n". Таким образом, я могу ввести массив любого размера. Символ новой строки находится в конце каждой строки текста в текстовом файле (в виде ввода ввода). Чтение файла останавливается при чтении новой строки. Тем не менее, у меня возникают проблемы с его реализацией. Есть ли какие-либо намеки, которые могут помочь мне увидеть это более четко? Большое спасибо!

РЕДАКТИРОВАТЬ:

Входной файл

xxxxxxxxxxxxxx
x            x
x            x
x            x
x            x
x            x
xxxxxxxxxxxxxx 

Я надеюсь вставить поле выше (вместе со всеми его символами, содержащимися в нем) в соответствующие значения массива символов. Я хочу остановить чтение после прочтения самого правого столбца x внутри и после прочтения окончательного x (внизу справа). Вы можете видеть, что моя проблема возникает из-за того, что массив, размер которого больше размера моего текстового поля. Я понимаю, что могу исправить это, приравняв массив символов к тем же размерам, что и текстовое поле, но хочу сохранить достаточно большую константу, чтобы я мог читать в файле относительно большого размера.

  • 1
    '/n' -> '\n'
  • 0
    Не могли бы вы уточнить: вы должны прекратить чтение из файла после прочтения новой строки? Возможно, предоставление очень маленького образца входного файла поможет описать вашу проблему.
Теги:
multidimensional-array
filestream

3 ответа

0
Лучший ответ

У меня есть одно решение, сделайте следующее:

int n=1025, m=1024, MAX_LINES=1025, i=0, j=0;
char character, Matrix[n][m];
fstream file;
file.open("file.txt", ios::in);
while (file.get(character))// loop executes until the get() function is able to read contents or characters from the file
{
Matrix[n][m]=character; // copy the content of character to matrix[n][m], here n is used to work as lines and m as normal arrays.
m++; // finished copying to matrix[n][m] then m++ else the program will overwrite the contents to the same array.
If (m>=1024)// if string[n][m] reached the limit which is 1024.
{
Matrix[n][m]='\0'; //termimate that line
m=0;// start with a new column
if (n<MAX_LINES)// if n is less than 1024 then
n++;// write to a next line because m  can support only 1024 chars.
}
Matrix[n][m]='\0';// this will terminate the whole string not just one line.
file.close();

Матричные массивы заполняются до тех пор, пока файл не будет иметь содержимого, но меньше 1024x1024 символов, u может увеличить ввод символов из файла, но я сталкиваюсь с проблемами при приеме в сеть более 4 килобайт данных в матрицу...

Я надеюсь, что это поможет вам, если поможет даже немного, а затем +1 проголосовать за мой ответ PLS...

  • 0
    Да, этот ответ очень помогает. Большое спасибо за подробные комментарии (самые маленькие вещи помогают больше всего), они позволили мне довольно легко уловить поток кода. Я ценю это! Сейчас я не могу голосовать, потому что моя репутация еще не достигла 15-летнего возраста. Однако я поставил вам галочку за хороший ответ на вопрос. Спасибо!
  • 0
    Спасибо Тейлор, я просто пошутил об этом, оставь это, но в моем коде есть какая-то ошибка, n и m должны быть инициализированы нулем, а массивы Matrix должны быть созданы вручную с помощью char Matrix [1024] [1025] wait я редактирую свой ответ ...
0

Если вы не ограничены использованием массива, я хотел бы добавить альтернативное решение, которое позволит вашему холсту быть динамическим.

using std::vector;

std::ifstream whiteboard(board_name);

vector<vector<char>> canvas;
canvas.emplace_back();
//     ^ Replace with push_back(vector<char>()); if not using C++11

char c;
while (whiteboard.get(c)) {
    if (c == '\n') {
        canvas.emplace_back(); // See above
    }
    else {
        canvas.back().push_back(c);
    }
}

Вы можете выбрать итерацию через свой холст, используя циклы, основанные на диапазонах, или с помощью индекса (итераторы тоже работают, но уродливы):

// Loop through using range-based for (C++11)
for (auto& row : canvas) {
    for (auto& col : row) {
        std::cout << col;
    }
    std::cout << std::endl;
}

// Loop through using index
for (int i = 0; i < canvas.size(); i++) {
    for (int j = 0; j < canvas[i].size(); j++) {
        std::cout << canvas[i][j];
    }
    std::cout << std::endl;
}
0

Вы ищете что-то вроде этого:

ifstream whiteboard;
whiteboard.open(board_name);

if ( !whiteboard.is_open() )
{
    // do something here...
}

char c;
int row = 0, col = 0;

while ( whiteboard.get( c ) )
{
    if ( c == '\n' )
    {
        row++;
        col = 0;
        continue;
    }

    canvas[ row ][ col++ ] = *reinterpret_cast< unsigned char * >( &c );
}

whiteboard.close();

С помощью этого кода вы можете заполнить свою матрицу содержимым файла... всегда предполагая, что "массив" в файле вписывается в массив canvas[][]

Ещё вопросы

Сообщество Overcoder
Наверх
Меню