/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
jdjespers.. 500
kyllekylle 500
Bech_bb 500
scootergr.. 300
gibson 300
molokyle 287
10  strarup 270
En hel fil ind i std::string
Fra : Anders Melchiorsen


Dato : 13-06-01 12:34

Hvis jeg vil gemme en std::string i en fil gør jeg det således:

{
   ofstream file(name.c_str());
   file << s;
}


Hvorledes kan jeg lige så let indlæse en hel fil i en std::string?

--
Regards, Anders

....if a Microsoft product fails, who do you sue?

 
 
Jesper Gødvad (13-06-2001)
Kommentar
Fra : Jesper Gødvad


Dato : 13-06-01 18:35


"Anders Melchiorsen" <anders@kalibalik.dk> wrote in message
news:m2r8wo1umk.fsf@dolle.kalibalik.dk...
> Hvis jeg vil gemme en std::string i en fil gør jeg det således:
>
> {
> ofstream file(name.c_str());
> file << s;
> }
>
> Hvorledes kan jeg lige så let indlæse en hel fil i en std::string?

char buf[1];
std::string s = "";
ifstream ind( name.c_str(), ios::binary );

while ( ind.read (buf, 1 ) )
s += buf;





Igor V. Rafienko (13-06-2001)
Kommentar
Fra : Igor V. Rafienko


Dato : 13-06-01 19:46

* Jesper Gødvad

> char buf[1];
> std::string s = "";
> ifstream ind( name.c_str(), ios::binary );
>
> while ( ind.read (buf, 1 ) )
> s += buf;


Tja, det er også en mulighet:

1) initialisering vha. iterator range:

ifstream ifs( "/etc/passwd" );
string ss( (istreambuf_iterator< char >( ifs )),
    (istreambuf_iterator< char >()) );

2) via rdbuf/sstream:

ifstream ifs( "/etc/passwd" );
ostringstream buf;
buf << ifs.rdbuf();
string ss( buf.str() );





ivr
--
Amy: Psst... look what life was like before genetic engeneering.
Leela: Those poor 20th century women...
-- Futurama, "Why must I be a Crustacean in love?"

Anders Melchiorsen (13-06-2001)
Kommentar
Fra : Anders Melchiorsen


Dato : 13-06-01 23:47

igorr@ifi.uio.no (Igor V. Rafienko) wrote on 13-Jun-01:

> 2) via rdbuf/sstream:
>
> ifstream ifs( "/etc/passwd" );
> ostringstream buf;
> buf << ifs.rdbuf();
> string ss( buf.str() );

Jeg har valgt denne, da den har fordel af at ville oversættes med min
compiler (gcc 2.96 fra Mandrake 8.0).

Tak for hjælpen til alle!

--
Regards, Anders

....if a Microsoft product fails, who do you sue?

Igor V. Rafienko (14-06-2001)
Kommentar
Fra : Igor V. Rafienko


Dato : 14-06-01 13:05

* Anders Melchiorsen

[snip om rdbuf/sstreams]

> Jeg har valgt denne,


Var klar over at denne dobler hukommelsesbehovet: dersom filen er på
10MB, vil programmet trenge _midlertidig_ 20 MB (altså buffring i
ostringstream samt string objektet der innholdet havner hen).

Initialisering vha. iterator ranges har ikke dette problemet.

(Hva er det man sier -- there is no silver bullet?)

> da den har fordel af at ville oversættes med min
> compiler (gcc 2.96 fra Mandrake 8.0).


3.0 skulle komme på fredag :)





ivr
--
Amy: Psst... look what life was like before genetic engeneering.
Leela: Those poor 20th century women...
-- Futurama, "Why must I be a Crustacean in love?"

Mogens Hansen (13-06-2001)
Kommentar
Fra : Mogens Hansen


Dato : 13-06-01 20:35


"Jesper Gødvad" <Xesper@goedvad.dk> wrote in message
news:9g87vf$ln8$1@sunsite.dk...
>
> > Hvorledes kan jeg lige så let indlæse en hel fil i en std::string?
>
> char buf[1];
> std::string s = "";
> ifstream ind( name.c_str(), ios::binary );
>
> while ( ind.read (buf, 1 ) )
> s += buf;

Nej.
Du aktiverer
string& string:erator+=(const char* s);
eller rettere
basic_string<charT,traits,Allocator>&
basic_string<charT,traits,Allocator>:erator+=(const charT* s);
som forventer en nul termineret streng.
buf er ikke nul termineret.

Prøv i stedet:

#include <string>
#include <fstream>
#include <iostream>
#include <algorithm>
#include <iterator>
#include <stdexcept>

int main(void)
{
using namespace std;
try {
ifstream is("file.txt");
// throw exception if file does not exist
is.exceptions(ios::badbit | ios::failbit);
// throw exception if reading fails
is.exceptions(ios::badbit);
string file_content;
copy(istreambuf_iterator<char>(is), istreambuf_iterator<char>(),
back_inserter(file_content));
cout << file_content << endl;
return 0;
}
catch(const exception& x) {
cerr << x.what() << endl;
return -1;
}
}

Det efter min bedste overbevisning gyldig C++, og bør virke på enhver
rimelig compiler.
Det virker med Borland C++Builder V5.
Det virker med Microsoft Visual C++ .NET Beta 1
Det compilerer næsten med gcc 2.96 under RedHat Linux 7.0 (den kender ikke
typen "istreambuf_iterator")
Det compilerer næsten med Microsoft Visual C++ V6.0 (den påstår at
"push_back" ikke er member funktion i "string")

Venlig hilsen
Mogens Hansen



Igor V. Rafienko (13-06-2001)
Kommentar
Fra : Igor V. Rafienko


Dato : 13-06-01 21:03

* Mogens Hansen

[snip]

> string file_content;
> copy(istreambuf_iterator<char>(is), istreambuf_iterator<char>(),
> back_inserter(file_content));


Kan du finne et krav om at std::basic_string skal ha en push_back
medlem?


> Det compilerer næsten med Microsoft Visual C++ V6.0 (den påstår at
> "push_back" ikke er member funktion i "string")


Jeg tror ikke[tm] den tar feil :)





ivr
--
"... car il faut convenir que Dieu n'a crée les femmes que pour
apprivoiser les hommes"
                  Voltaire

Mogens Hansen (13-06-2001)
Kommentar
Fra : Mogens Hansen


Dato : 13-06-01 21:48


"Igor V. Rafienko" <igorr@ifi.uio.no> wrote in message
news:xjvn17c4083.fsf@heidrek.ifi.uio.no...
> * Mogens Hansen
>
> [snip]
>
> > string file_content;
> > copy(istreambuf_iterator<char>(is), istreambuf_iterator<char>(),
> > back_inserter(file_content));
>
>
> Kan du finne et krav om at std::basic_string skal ha en push_back
> medlem?

ISO C++ Standarden, §21.3, side 385 sidste linie.

>
>
> > Det compilerer næsten med Microsoft Visual C++ V6.0 (den påstår at
> > "push_back" ikke er member funktion i "string")
>
>
> Jeg tror ikke[tm] den tar feil :)
>

Måske nu ?


Venlig hilsen

Mogens Hansen



Søg
Reklame
Statistik
Spørgsmål : 177501
Tips : 31968
Nyheder : 719565
Indlæg : 6408522
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste