2008-11-27 15 views
37

piśmie stringstream obecnie używam std::ofstream następująco:zawartość do ofstream

std::ofstream outFile; 
outFile.open(output_file); 

Potem próbują przekazać std::stringstream obiekt do outFile następująco:

GetHolesResults(..., std::ofstream &outFile){ 
    float x = 1234; 
    std::stringstream ss; 
    ss << x << std::endl; 
    outFile << ss; 
} 

Teraz moja outFile zawiera nic poza śmieci: "0012E708" powtórzone w całości.

W GetHolesResults mogę napisać

outFile << "Foo" << std:endl; 

i będzie odtwarzany prawidłowo w outFile.

Wszelkie sugestie dotyczące tego, co robię źle?

+1

Proponuję Parafrazując tytuł do czegoś w wierszu: „pisanie zawartość stringstream do ofstream” (lub ostream za to, co się liczy) –

+1

Eric, należy zaznaczyć odpowiedź Johannes' jak przyjął więc, że mogę usunąć kopalni (co jest wyraźnie gorsze niż jego podejście) –

+1

OK, gotowe. Ale w tamtych czasach użyłem twojego rozwiązania =) – Eric

Odpowiedz

67

Możesz to zrobić, ale nie musisz tworzyć napisu. Powoduje to, że strumień wyjściowy odczytuje zawartość strumienia po prawej stronie (można go użyć z dowolnymi strumieniami).

outFile << ss.rdbuf(); 
+5

Jestem ciekawy: dlaczego to rozwiązanie działa z 'std :: stringstream', ale nie z' std :: ostringstream'? W drugim przypadku otrzymuję pusty plik. –

+3

@JaviV, ponieważ można [napisać tylko] (http://en.cppreference.com/w/cpp/io/basic_ostream) do 'std :: oANYSTREAM' i czytać tylko z' std :: iANYSTREAM'. Nie będzie sensu 'output_stream', jeśli miałby również operacje' read'. Jeśli potrzebujesz obu po prostu użyj 'std :: ANYSTREAM' i jesteś w domu :) –

3

Podczas przekazywania strumienia rdbuf do strumienia nowe linie nie są tłumaczone. Tekst wejściowy może zawierać \n, więc find replace nie będzie działać. Stary kod zapisał do strumienia i przełączając go na strumień łańcuchowy, tracił tłumaczenie końcowe.

+2

To powinno być komentarzem, a nie odpowiedzią, ponieważ nie powiedziałeś, jak napisać std :: stringstream do std :: ofstream – bitek

8

Jeśli używasz std::ostringstream i zastanawiasz się, dlaczego nic nie zostanie napisane przy pomocy ss.rdbuf(), a następnie użyj funkcji .str().

outFile << oStream.str(); 
+4

twoja odpowiedź doprowadził mnie do następującej realizacji: aby uzyskać tablicę 'char' z' ss', możesz zrobić 'ss.str(). c_str()'. (po prostu publikuj tutaj dla korzyści początkujących, którzy natkną się na to w przyszłości.) – dbliss

+1

@Digital_Reality, dzięki! nic nie zostało napisane, gdy użyłem programu rdbuff. Jaki jest tego powód? – Nasir

Powiązane problemy