Как узнать неизвестное количество строк и столбцов во входном файле?

0

Итак, входной файл выглядит так:

00000000100000001010 
00000000010000001001
11100000010100000010 
10100100101010101010 
00101010010010101000

Это пример сетки, размер которой равен 5x20, а catch - строки и cols могут быть произвольными. Это означает, что мне нужно выяснить количество строк и столбцов входного файла, прежде чем я смогу начать вычислять свой двумерный массив.

Поэтому я немного запутался, потому что сейчас я просто пытаюсь прочитать в массиве, а затем выводить его на консоль, не зная сначала строки и столбцы. Пожалуйста, помогите мне в этом, это раздражает, и я не могу найти способ сделать это.

PS Я не могу использовать библиотеку строк

  • 0
    Прочитайте каждую строку в std::string и вставьте ее обратно в std::vector<std::string>> . Печать будет простой, и вы сможете получить метод size throw size() .
  • 0
    Это не использует библиотеку <string> правильно? Потому что я не могу это использовать
Показать ещё 6 комментариев
Теги:
multidimensional-array
file-io

2 ответа

0

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

Использовать контейнер с автоматической настройкой размера

Вы все еще можете получить существенное преимущество (для этого случая) свободного управления памятью без использования string. Например, поместите символы поочередно в vector:

std::ifstream inF("input.txt");
std::vector<char> contents;
char c;

while(inF.get(c).good())
{
    contents.push_back(c);
}

int rows = 1 + std::count(contents.begin(), contents.end(), '\n');
int columns = std::find(contents.begin(), contents.end(), '\n') - contents.begin();

Прочитайте длину файла из потока

Это довольно простой вопрос, чтобы выяснить, насколько велик файл и предварительно выделить буфер, достаточно большой для его хранения:

std::ifstream inF("input.txt");

// option 1
inF.seekg(0, std::ios_base::end);
int charCount = inF.tellg();

// option 2
//int charCount = 0;
//while(inF.get() != std::char_traits<char>::eof())
//{
//    charCount++;
//}
//inF.clear();

char* contents = new char[charCount + 1];

inF.seekg(0);
inF.read(contents, charCount);

contents[charCount] = '\0';

int rows = 1 + std::count(contents, contents + charCount, '\n');
int columns = std::find(contents, contents + charCount, '\n') - contents;

delete[] contents;
0

Традиционный способ сделать это - пропустить каждый символ в массиве символов и отслеживать количество символов до тех пор, пока вы не нажмете новую строку, в зависимости от формата данных.

#include <iostream>

using namespace std;

int main()
{
    char arr[] = "00000000100000001010\n00000000010000001001\n11100000010100000010\n10100100101010101010 \n00101010010010101000";
    int cols = 0;
    int rows = 0;

    for(int i = 0; arr[i] != '\0';i++)
    {
        if(rows == 0)
            cols++;
        if(arr[i] == '\n')
            rows++;
    }
    std::cout<<cols<<" Colums"<<std::endl<<rows+1<<" Rows"<<std::endl;
    return 0;
}

Это предполагает, что столбцы являются однородными, и у вас есть данные в массиве.

Это намного проще/чище/лучше читать по характеру по характеру из потока, но это старый способ.

Ещё вопросы

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