2010-06-24 11 views
7

Mam następujący kod, działa na Suse 10.1/G ++ 4.1.0, a nie zapisu pliku:ofstream nie wylewać

#include <fstream> 
#include <iostream> 

int main(){ 
    std::ofstream file("file.out"); 
    file << "Hello world"; 
} 

Plik został prawidłowo utworzony i otwarty, ale jest pusty. Gdybym zmienić kod do:

#include <fstream> 
#include <iostream> 

int main(){ 
    std::ofstream file("file.out"); 
    file << "Hello world\n"; 
} 

(dodać \n do tekstu), to działa. Próbowałem także przepłukać strumień, ale to nie zadziałało.

Wszelkie sugestie?

+2

Jak sprawdzić wynikowy plik? – log0

+1

Program na Debianie/Sidie z g ++ 4.4.4 działa zgodnie z oczekiwaniami, a file.out zawiera ciąg (bez nowej linii). Spróbuj zaktualizować swój kompilator lub system operacyjny - oba są nieaktualne. – Dummy00001

+1

Jak sprawdzasz, czy plik jest pusty?Zrób to na wynikowym pliku: wc i zobacz, jakie są dane wyjściowe. Powinno wynosić 0 2 11. 0 linii, 2 słowa, 11 znaków. Bez nowego wiersza wynik "Witaj świecie" pojawi się w wierszu polecenia, więc możesz go po prostu przegapić. –

Odpowiedz

7

Jeśli sprawdzisz plik robiąc cat, może to być twoja powłoka, która jest źle skonfigurowana i nie drukuje linii, jeśli nie ma końca linii.
std::endl dodaje jeden kolor: \ni.

+3

Tak, spróbuj zrobić 'cat file; echo'. Nie używaj bezmyślnie 'endl'. Nienawidzę kodu, który używa tego głupiego konstruktu i chciałbym, żeby ludzie odstąpili od standardu. Spłukiwanie jest kosztowne i zawsze powinno być wykonywane świadomie i z wyprzedzeniem. – Omnifarious

+0

Problemem był błędny edytor użyty w mojej pracy, który nie wyświetla wiersza, jeśli na końcu nie ma "\ n". Oczywiście, vi pokazuje to dobrze. Dzięki. –

0

Czy

file << "Hello world" << std::endl; 

pracę?

endl wstawia znak nowej linii i opróżnia bufor. Czy to właśnie miałeś na myśli, kiedy powiedziałeś, że już próbowałeś go spłukać?

4

nie wiem, czy to jest to, czego próbowałem, ale należy zrobić:

file << "Hello World" << std::flush; 

Aktualizacja; Wyjeżdżam tę odpowiedź tutaj ze względu na użytecznych uwag

w oparciu o opinie, będę modyfikować moją radę: nie należy mieć jawnie wywołać std::flush (lub file.close() o to chodzi), bo robi destructor to dla Ciebie.

Dodatkowo, wywoływanie flush jawnie wymusza operację We/Wy, która może nie być najbardziej zoptymalizowana. Odroczenie do leżących u podstaw iostreams i systemu operacyjnego byłoby lepsze.

Oczywiście problem OP nie był związany z wywołaniem lub nie wywołaniem std::flush i prawdopodobnie spowodowany był próbą odczytania pliku przed wywołaniem destruktora strumieni plików.

+2

Destrator 'ofstream' powinien automatycznie się przepłukać. – Omnifarious

+0

@Omnifarious: To zasługuje na awans? Czy moja odpowiedź * jest zła *? –

+1

@John Weldon - Jest źle, ponieważ tak naprawdę nie rozwiązuje rzeczywistego problemu z OP. Może być przydatny w debugowaniu i ustalaniu, jaki jest prawdziwy problem (i powinien być komentarzem), ale nie jest rozwiązaniem sam w sobie. Jeśli jest rozumiane jako rozwiązanie, sugeruje rozwiązanie typu kultowy ładunek, w którym wstawia się kod bez zrozumienia, dlaczego musi tam być. – Omnifarious

4

Destruktor powinien opróżnić i zamknąć plik.

Jestem całkiem pewien, błąd jest kolejnym miejscem, albo

1) Nie sprawdzić w odpowiednim momencie. W którym momencie porównujesz zawartość pliku, "po" wyjściach, czy ustawiasz punkt przerwania przed wyjściem programu, a następnie sprawdzasz zawartość plików?

2) W jakiś sposób program ulega awarii przed jego wyjściem?

+0

Tak, jeśli dany program działa, a po jego zakończeniu i otrzymasz odpowiedź, nie zawiera danych, jest gdzieś błąd. – Omnifarious

Powiązane problemy