Считайте конец строки в 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 ответов

Другие вопросы по тегам