ifstream — считать конец строки в C ++, читая «слова»

Я пишу программу, которая в качестве первого шага читает текстовые файлы размером ~ 30 МБ.
Эти файлы представляют собой последовательность чисел от 0 до 255 со случайными переносами строк (текстовые изображения ImageJ через стеки RGB).
Я могу прочитать данные в vector<int> без проблем и сформировать vector<vector<int> > для части RGB также. Тем не менее, я хотел бы знать высоту и ширину моих изображений.

Всего доступно через myVector[0,1,2].size(), но если я не знаю соотношение сторон, я не могу получить высоту / ширину из этого.

Если я использую file.get(nextChar); if (nextChar == '\n'){...} тогда код продолжит читать, афаик.

Я пытался читать символы в строке отдельно от чтения в файлах, но в дополнение к увеличению времени выполнения (что не так уж и сложно) у меня есть более серьезная проблема в том, что файлы содержат tab пробелы, а не настоящие пробелы, поэтому, хотя я изначально думал, что каждое число состоит из 4 символов, например 123(space) или же 12(space)(space) и т. д., оказывается, они будут 123(tab) а также 12(tab), которые имеют различное количество символов.

Как я могу посчитать мои слова в строке? Пример кода ниже:

void imageStack::readFile(const char *file, std::vector<int> &values)
{
std::ifstream filestream;
filestream.open(file);

if (!filestream.fail())
{
std::cout<< "File opened successfully: " << file << std::endl;
int countW=0;
char next;
while (!filestream.eof())
{
int currentValue;
filestream >> currentValue;
values.push_back(currentValue);
countW++;
if (filestream.get(next)=='\n')
// This doesn't work, but I think if I used filestream.get(next);
// if (next == '\n') that would check correctly,
// it would just move the file marker
{
std::cout<< "countW = " << countW << std::endl;
}
}
filestream.close();
values.pop_back();
}
else
{
std::cout << "File did not open! Filename was " << file << std::endl;
}
}

Код ниже не считается точно:

std::vector<int> imageStack::getDimensions(const std::string fileName)
{
std::vector<int> dim(2);

std::stringstream rfN;
rfN << fileName << "R";
std::string rFileName = rfN.str();
const char *file_ptr;

file_ptr = rFileName.c_str();
std::ifstream file;
file.open(file_ptr);

int widthCount=-1, heightCount=-1;
if (!file.fail())
{
char next;
int counterW = 0;
int counterH = 0;
while(file.get(next))
{
counterW++;
if (next == '\n')
{
counterH++;
if (widthCount == -1)
{
std::cout << "The first line has " << counterW << " characters." << std::endl;
}
if (widthCount != -1 && widthCount != counterW)
{
//~ std::cout<< "The width counter didn't get the same number every time!" << std::endl;
//~ std::cout<< "widthCount = " << widthCount << std::endl;
//~ std::cout<< "counterW = " << counterW << std::endl;
}
widthCount = counterW;
counterW = 0;
}
heightCount = counterH;
}
file.close();
}
//~ std::cout   << "Values found for width and height are "//~ << widthCount << ", " << heightCount << std::endl;

dim[0] = ((widthCount-1)/4);
dim[1] = heightCount;
return dim;
}

0

Решение

Задача ещё не решена.

Другие решения


По вопросам рекламы [email protected]