Итак, входной файл выглядит так:
00000000100000001010
00000000010000001001
11100000010100000010
10100100101010101010
00101010010010101000
Это пример сетки, размер которой равен 5x20, а catch - строки и cols могут быть произвольными. Это означает, что мне нужно выяснить количество строк и столбцов входного файла, прежде чем я смогу начать вычислять свой двумерный массив.
Поэтому я немного запутался, потому что сейчас я просто пытаюсь прочитать в массиве, а затем выводить его на консоль, не зная сначала строки и столбцы. Пожалуйста, помогите мне в этом, это раздражает, и я не могу найти способ сделать это.
PS Я не могу использовать библиотеку строк
Есть много способов действовать, в зависимости от того, что побудило вас за запрет учителей на использование 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;
Традиционный способ сделать это - пропустить каждый символ в массиве символов и отслеживать количество символов до тех пор, пока вы не нажмете новую строку, в зависимости от формата данных.
#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;
}
Это предполагает, что столбцы являются однородными, и у вас есть данные в массиве.
Это намного проще/чище/лучше читать по характеру по характеру из потока, но это старый способ.
std::string
и вставьте ее обратно вstd::vector<std::string>>
. Печать будет простой, и вы сможете получить метод size throwsize()
.