C ++ - у getline есть максимальная строка или символьная емкость? - PullRequest
4 голосов
/ 11 декабря 2011

Мой вопрос касается задания, над которым я работаю. Кажется, что есть несколько способов приблизиться к заданию.

Программа, которую я пишу, будет фильтром для текстовых файлов. Цель задания - получить опыт работы с fstream и getline.

Требования:

  1. Прочитать один текстовый файл (любым способом, не обязательно все сразу)
  2. Запись в отдельный текстовый файл (любым возможным способом, можно добавлять или записывать символ за символом)
  3. Предполагается, что каждое предложение заканчивается точкой.
  4. Первая буква каждого предложения должна быть заглавной.
  5. Все, кроме первой буквы каждого предложения, должны быть строчными. (имена собственные тоже - это тривиальный пример)

У меня есть рабочий черновик программы, которую я написал, но getline несовместима с тем, как он читает мой текстовый файл. По сути, он будет читать одну строку в виде строки, что я и хочу. Как это читается во второй строке; однако программа выдает ошибку времени выполнения на полпути через строку, и Windows закрывает ее.

Есть ли в getline буфер, который заполняется и должен очищаться после каждого чтения строки?

Мой псевдокод для программы:

  1. Используйте getline для чтения строки из строки x с остановкой на период (.).
  2. Перебирайте строковые символы, в верхнем регистре первую букву, а затем в нижнем регистре остальные.
  3. Чтение в другой строке, продолжающейся после последнего периода (.) В текстовом файле.
  4. Повторяйте, пока текстовый файл не будет прочитан.
  5. Запись во второй текстовый файл.

Я реализую getline следующим образом:

getline(fileIN, str1, '.')

str1 - строка, которая читается из каждой строки.

Правильно ли я использую getline? Я продумываю эту проблему правильно и эффективно?

* Когда я заканчивал этот расширенный вопрос / раздел, я понял, что getline может использовать больше памяти для символов '\ r' или '\ n' на концах строк или по причинам, не связанным с память, getline неправильно обрабатывает (в соответствии с моими целями) предложения, которые переносятся на новые строки. Разве getline не справляется с переносом предложений / слов?

Кроме того, есть ли способ динамически указывать getline для чтения первой строки до точки (.) Или новой строки ('\ n'), которая когда-либо появляется ПЕРВЫЙ?

Спасибо за ваше время и внимание.

Ответы [ 2 ]

6 голосов
/ 11 декабря 2011

Да, вы используете getline правильно. Обязательно используйте его в качестве условия для вашего while цикла или другого условия:

while(std::getline(fileIN, str1, '.')) {
    // process str1
}

и не делайте ошибку, которую совершали многие другие, пытаясь использовать fileIN.good() или !fileIN.eof() или что-то еще (это приведет только к головной боли и сердечной боли).

Не нужно очищать буфер str1, поскольку он управляется классом string. Он будет расширяться по мере необходимости и освобождать себя, когда переменная выходит из области видимости. Это одна из причин, почему мы любим классы стандартной библиотеки и дважды подумаем, прежде чем использовать необработанные массивы.

Кроме того, не существует искусственных ограничений на вместимость string. Единственным ограничивающим фактором является доступная память системы, поэтому при использовании виртуальной памяти она может составлять чуть менее 4 ГБ в 32-разрядной системе или чуть менее 2 64 байт в 64-разрядной системе. .

1 голос
/ 11 декабря 2011

Ограничение на getline (из библиотеки C) ограничено ресурсами (т. Е. Памятью), поэтому вам не стоит сильно беспокоиться (если у вас нет файла с одной строкой в ​​миллиард байтов).

STL C ++ getline имеет аналогичные ограничения.

Так что вам, вероятно, не стоит беспокоиться, если вы не хотите создать пуленепробиваемую программу (а затем выможет заботиться о других вещах, таких как ошибки ввода-вывода, переполнение диска, ...).

...