"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