2013-10-12 6 views
1

может кто-нибудь сказать мне, что в этом плохого? неC++: проблемы с потоком

#include <stdio.h> 
#include <fstream> 
#include <iostream> 
#include <sstream> 
#include <vector> 

class writeManager 
{ 
    std::vector<double> valueVector; 
    std::ofstream ofsFile; 

public: 

    writeManager(void); 
    void writeOnFile(int); 
    void openOfsStreams(void); 
    void closeOfsStreams(void); 

}; 

writeManager::writeManager(void) 
{ 
    openOfsStreams(); 
    ofsFile << "FIRST LINE" << std::endl; 
    closeOfsStreams(); 
} 

void writeManager::writeOnFile(int input) 
{ 
    openOfsStreams(); 

    if(ofsFile.good()) 
    { 
     ofsFile << input << std::endl; 
    } 
    else 
    { 
     std::cout << "Hey!" << std::endl; 
    } 

    ofsFile.close(); 
} 

void writeManager::openOfsStreams(void) 
{ 
    ofsFile.open("/home/user/example.txt"); 
} 

void writeManager::closeOfsStreams(void) 
{ 
    ofsFile.close(); 
} 

int main() 
{ 
    writeManager writeObject; 
    for (unsigned int i = 0; i!= 5; i++) 
    { 
     writeObject.writeOnFile(i); 
    } 
} 

Я хотел бы видеть этот вывод на файл "example.txt"

FIRST LINE 
0 
1 
2 
3 
4 

, но я получаю только

4 

PS: нет "Эй!" печатается.

ответ

4

Проблема в том, что вы открываете и закрываете файл несколько раз, и каждый раз, когда вы открываете файл, вы уничтожаете содержимое, которое было там ранее.

Возможно, вы должны открыть файл один раз только в конструкторе (и не закрывать там файл).

Альтернативой было бы открыть файл в режиме «добавить», но это было бы очень неэффективно, открытие файла было бы дорогостоящей операцией. Как Liho предложил

ofsFile.open("/home/user/example.txt", std::ofstream::out | std::ofstream::app); 
2

Когда вы открываете ofstream несколько раз, он всегда переписывает его с самого начала.

Одним из возможных решений было бы использовать app флаг, то есть изменение:

ofsFile.open("/home/user/example.txt"); 

к

ofsFile.open("/home/user/example.txt", std::ofstream::out | std::ofstream::app); 

Но еще лучше было бы открыть этот ofstream только один раз в конструкторе и закрыть его в деструкторе.

+0

Я считаю, что 'std :: ofstream :: out' не нужно для' ofstream'. –

+0

@MatthieuM .: Тем не менее, там не может быть никаких ошибок. Он просто явно выражает еще раз, когда вы открываете поток, предназначенный для вывода. – LihO

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