Вопрос по c++ – @dirk - я думаю, что мы должны побудить людей понять, что они должны проверить, действительно ли getline (или какая-либо функция чтения, которую они используют) действительно читали

1

аю, что мне может понадобиться использовать логическое bValue = false для моего условия while:

char cArray[ 100 ] = "";
ifstream object;
cout << "Enter full path name: ";
cin.getline( cArray, 100 );
if ( !object ) return -1   // Path is not valid? This statement executes why?

ifstream object.open( cArray, 100 );

// read the contents of a text file until we hit eof.
while ( !object.eof() )
{
// parse the file here

}

Почему я не могу ввести полный путь к текстовому файлу?

Это может быть из-за eof. Является ли их синтаксис для логического выражения, которое может эмулировать eof?

Можно мне:

while ( !object == true )
{
// parase contents of file
}
Вы не скомпилировали этот код в компиляторе C ++, если только вы не переопределили ошибки. Вы перепечатали это из того, что фактически скомпилировало? Возможно, вам следует скопировать и вставить код, с которым у вас возникла проблема. David Thornley

Ваш Ответ

2   ответа
-1

ifstream::open Функция принимает имя файла и необязательный режим. Поскольку вы хотите прочитать весь файл, почему бы не начать с самого начала:

if (obj) { // file successfully opened for reading
    while (obj.good()) {
        // read in a line at a time
        string line;
        getline(line, obj);
        if (!line.empty()) { // we have something to work with
           // parse
        }
    }
}

Конечно, более гладкая версия должна проверитьgetline вwhile Цикл, как Нил Баттерворт.

это действительно не очень хорошая идея - "parse" будет вызываться, даже если getline не может ничего прочитать anon
@dirk - я думаю, что мы должны побудить людей понять, что они должны проверить, действительно ли getline (или какая-либо функция чтения, которую они используют) действительно читали anon
Я думаю, что я просто не могу прочитать во всем пути к файлу .. На самом деле может даже не быть проблемы с Eof user40120
@Neil: Конечно, это не качество продукции, а просто идея. dirkgently
@lampshade: проверьте, достаточно ли большой буфер cArray для пути к файлу или нет. dirkgently
7

обратите внимание, что для правильного способа чтения текстового файла НЕ требуется использование функций eof (), good (), bad () или indifferent () (хорошо, я создал последний). То же самое верно в C (с fgets (), feof () и др.). По сути, эти флаги будут установлены только ПОСЛЕ того, как вы пытались что-то прочитать, с помощью функции, подобной getline (). Намного проще и с большей вероятностью правильно проверить, что функции чтения, такие как getline (), действительно что-то читают напрямую.

Не проверено - я обновляю свой компилятор:

#include <iostream>
#include <fstream>
#include <string>
using namespacr std;

imt main() {

   string filename;
   getline( cin, filename );

   ifstream ifs( filename.c_str() );
   if ( ! ifs.is_open() ) {
       // error
   }

   string line;
   while( getline( ifs, line ) ) {
       // do something with line
   }
}
Я не понимаю, что вы подразумеваете под "сентеинал" anon
Могу ли я использовать контролируемое состояние сентеинал тогда? Записан ваш getline (ifs, line)? user40120
en.wikipedia.org/wiki/Sentinel_value Dustin Getz

Похожие вопросы