2015-06-10 3 views
-3

У меня, кажется, проблема с чтением файлов. Я использую Visual Studio Community 2013, и он будет делать все, кроме чтения файлов. Я проверил, чтобы файл, который был прочитан и написан, находится в том же каталоге. Следующий код, где я считаю, что проблема быть:C++ ничего не читает из файлов

if (inStream.bad()) 
{ 
    inStream.close(); 

    outStream.open(filename); 
    outStream << "This is a test file: \nWelcome to the Dark Side!"; 
    outStream.close(); 
} 

inStream.open(filename, ios::in); 
if (inStream.good()) 
{ 
    while (getline(inStream, stream[1])) 
    { 
     stream[0] += stream[1] + '\n'; 
    } 

    inStream.close(); 

} 
else 
{ 
    cout << "THIS FILE IS ROYALLY *jacked* UP!!!!" << endl; 
} 

и я получаю «Этот файл царски козел» результат. Я не понимаю, почему он не читает. Пожалуйста помоги.

+0

Проблема возникает, вероятно, потому, что вы используете 'inStream.open (...)' 'независимо от того, является ли inStream' находится в хорошем состоянии или плохом состоянии. –

+0

Почему это имеет значение? Я думал, что .good() должен был убедиться, что он открыт правильно? –

+0

Нет, это состояние по умолчанию, когда ошибок не произошло. Когда файл открывается, 'stream' автоматически не очищается до' good'. – user35443

ответ

0

Изменение строки:

if (inStream.bad()) 
{ 
    inStream.close(); 

    outStream.open(filename); 
    outStream << "This is a test file: \nWelcome to the Dark Side!"; 
    outStream.close(); 
} 

inStream.open(filename, ios::in); 
if (inStream.good()) 

к

if (inStream.bad()) 
{ 
    inStream.close(); 

    outStream.open(filename); 
    outStream << "This is a test file: \nWelcome to the Dark Side!"; 
    outStream.close(); 

    // Clear the state of the stream. 
    inStream.clear(); 

    // Move this line inside the block. 
    inStream.open(filename, ios::in); 
} 

if (inStream.good()) 

Вы не хотите звонить open на действительном ifstream.

Вот пример программы, которая показывает, что вызов open по действующему ifstream может сделать его недействительным.

#include <iostream> 
#include <fstream> 

int main() 
{ 
    std::ifstream inFile("socc.in"); 
    if (inFile.good()) 
    { 
     std::cout << "ifstream is good.\n"; 
    } 

    inFile.open("socc.in"); 
    if (inFile.good()) 
    { 
     std::cout << "ifstream is still good.\n"; 
    } 
    else 
    { 
     std::cout << "ifstream is not good any more.\n"; 
    } 

    return 0; 
} 

Выход:

 
ifstream is good. 
ifstream is not good any more. 
+0

Это сработало, спасибо вам большое, я немного смущен, зачем закрывать его и снова открывать за пределами if, если не работает, но почему-то это заставило его работать. –

+0

@DavidGreen, если 'inStream' хорош, в вашем коде нет ничего, чтобы закрыть его, прежде чем открывать его снова. –

0

Это может помочь использовать clear перед открытием нового файла, так как open может не очищать флаги самостоятельно.

inStream.clear(); 
inStream.open(filename, ios::in); 

Вы также можете использовать is_open вместо good.

if(inStream.is_open()) { 
    ... 
+0

Я пробовал это, теперь он запускает код в is_open, но он все еще не читает ввод. –

+0

Если вы не получили свою ошибку и не читаете какие-либо данные, это означает, что файл был успешно открыт, но чтение не сработало. В противном случае ваш фиолет не может быть открыт. – user35443

0

Попробуйте вызвать inStream.clear(), прежде чем что-либо делать с ним. clear() очищает старые флаги как плохие, будучи истинными.

+0

Благодарим вас за разъяснение относительно того, что делает .clear(), я до сих пор немного путался с этим. –

Смежные вопросы