как я могу использовать fscanf
с потоком входного файла c ++?
Возможно. И g++
, и Visual Studio имеют собственные расширения, делающие это возможным. Если вы найдете такие возможности, они нестандартны и не переносимы. Я советую вам найти другие способы.
Если вы используете C ++, попробуйте использовать большинство из них. C
имеет fscanf
, который выглядит опрятно - но это зверь. C ++ имеет std::scanf
для переносимости - и это тот же тип зверя. Не используйте его, если вы программируете на C ++.
Проблема, которую вы пытаетесь избежать
for (i = 0; !inStream.eof() ; i++) inStream >> input[i];
пытается прочитать еще раз, если есть «Новая строка» в конце файла.
вызвано неправильным использованием eof()
. eof()
возвращает true
после того, как вы попытались прочитать за конец файла. Лучше l oop будет выглядеть так:
for (i = 0; inStream >> input[i] ; i++);
Обратите внимание, как извлечение и условия стали одним? Это не так. Извлечение происходит первым и возвращает поток , использованный при извлечении. Поток имеет bool
перегрузку, которая сообщает вам, находится ли он в состоянии сбоя или нет, что отлично подходит для такой проверки: if(stream >> variable) { /* success */ } else { /* fail */ }
.
Это работает, только если в вашем массиве достаточно записей для хранения все входные хотя. Ваш l oop не проверяет это. Если вы используете vector
, вы можете просто читать элементы и push_back
, чтобы заставить его работать долгое время. Если у вас фиксированный (относительно небольшой) размер и вы выполняете вышеперечисленные действия, он в конечном итоге не сможет.