1

Возникла такая проблема, что при считывании std::ifstream, используя оператор получения из потока (надеюсь, правильно назвал >>) и getline() параллельно, не получается заставить программу работать корректно.

Main.cpp

int main() {
    setlocale(LC_ALL, "ru");
int sizeofStr = 0;
std::ifstream fin("fileIn.txt");

while (!fin.eof()) {
    fin >> sizeofStr;
    fin.ignore();
    char* str = new char[sizeofStr];
    fin.getline(str, sizeofStr);
    std::cout << str << std::endl;

    delete[] str;
}

return 0;

fileIn.txt

62
железо курит нервно в сторонке, когда этот huy думает обо мне
13
eweeweжелезо курит нервно в сторонке, когда этот huy думает обо мне
3
жцуйrtfvфывелезо курит нервно в сторонке, узщцйшзйцзшущзцушз

И проблема именно начиная со строки, 13 в файле. sizeofStr заполняется числом 13, всё как надо,

в переменную str загружаются первые 13 символов строки, как и надо,

однако, в следующей итерации, из-за того, что там дальше остаются символы, sizeofStr не получает значение 3. Можно поставить в цикле после каждого getline() fin.ignore(), но тогда не будет работать итерация на первой строке, так как в ней ровно 62 символа и fin.ignore() проигнорирует строку со значением 13, что нам не нужно.

Можете посоветовать, что сделать?


Ред. 1

К сожалению, по условию можно только так задавать строку. Модули по типу <cstring> использовать нельзя


Заранее благодарю!

DiHASTRO
  • 805
  • а что мешает всегда использовать getline, а каждую нечетную строку переводить в число? – Zhihar Oct 24 '21 at 10:46
  • Или использовать string... – Harry Oct 24 '21 at 10:52
  • Однозначно вы все запутали начиная от условия цикла. и заканчивая тем, что "fin.ignore() проигнорирует строку со значением 13"(он по умолчанию игнорирует один символ) – AR Hovsepyan Oct 24 '21 at 12:56
  • @Zhihar, а можешь подсказать, как строку в число переводить? Есть ли методы встроенные для этого? Или вручную надо? – DiHASTRO Oct 24 '21 at 17:42
  • @Harry, к сожалению, по условию только через массив char. Сейчас укажу в вопросе – DiHASTRO Oct 24 '21 at 17:44
  • @ARHovsepyan, да, я понимаю, именно поэтому прошу помощи здесь – DiHASTRO Oct 24 '21 at 17:47
  • У вас всегда число не больше реальной длины строки? Такая проверка нужна? – Harry Oct 24 '21 at 17:54
  • https://en.cppreference.com/w/cpp/string/basic_string/stol – Zhihar Oct 24 '21 at 17:55
  • @Zhihar, к сожалению <string> нельзя использовать – DiHASTRO Oct 24 '21 at 17:56
  • @Harry, может быть и больше. То есть, может быть такое:

    20\nabcde

    – DiHASTRO Oct 24 '21 at 17:57
  • Тогда сформулируйте вопрос точно — что должна делать ваша программа... – Harry Oct 24 '21 at 18:02
  • 1
    @DiHASTRO, есть и просто функции не из STL: atoi – Zhihar Oct 24 '21 at 20:16
  • @Harry, честно говоря, ума не приложу, что тут добавить. Суть в том, что проблема именно в этом моменте. Думаю, информации предостаточно – DiHASTRO Oct 24 '21 at 20:19
  • @Zhihar, весьма благодарен! Напишите, пожалуйста, как ответ, я укажу в качестве решения – DiHASTRO Oct 24 '21 at 20:20
  • Для меня лично — нет. Что делать, если в строке число 10, а в следующей строке 3 символа? Считывать их с \n вместе, дочитывать до 10 из следующей строки, не читать вообще? Задача поставлена неоднозначно и неаккуратно. Кстати, @Zhihar просто не написал, что делать в этом случае, и какого размера буфер брать для считывания строки. А у вас проблемка в том, что в вашем исходнике можно читать не более чем число символов, на 1 меньшее, чем в числе в предыдущей строке. – Harry Oct 25 '21 at 05:16
  • Не говоря уж о конструкции while (!fin.eof()) {, за которую лично я готов бить клавиатурой по голове — до такой степени часто встречается эта ошибка, что хоть пиши в комитет по стандартизации, пусть стандарт переделывают... https://ru.stackoverflow.com/q/833980/195342 – Harry Oct 25 '21 at 05:20

1 Answers1

2

я бы решал в лоб

  1. считывал бы только с помощью getline в строкой буфер

  2. каждую нечётную строку переводил бы в число с помощью функции atoi

     const int value = atoi(buffer);
    
  3. если есть возможность того, что будут пустые строки, то можно код усложнить и пытаться получить число до тех пор пока оно получено не будет, следующая выборка строки - строка, дальше опять считываем строки пока не получится число (проверяется errno)

  4. если считывается не char*, а wchar_t*, то использовать надо функцию _wtoi

Zhihar
  • 37,513