2012-04-11 16 views
3

Wenn ifstream Klasse mit Worten aus einer Eingabedatei zu lesen, habe ich den folgenden Ausdruck verwendet:Unterschiede in der Lesedatei mit ifstream in g ++ und msvc

#include <iostream> 
#include <fstream> 

int main(int argc, char *argv[]) 
{ 
    std::ifstream inputStream(myFile.txt); 
    std::string myString; 
    myFile.open() 
    while(myFile.good()) 
    { 
     myFile >> myString; 
     printf("%s \n", myString); 
    } 
    return 0; 
} 

Der Inhalt MYFILE.TXT ist: "Diese ist ein einfaches Programm. "

Die kompiliert und führt wie erwartet mit g ++ - Compiler.

Derselbe Code, wenn mit msvc 2008 kompiliert wird, gibt Fehler bei dem Extraktionsoperator (>>) zurück, der erfordert, dass ich den std :: string mit einem initialisierten Zeichenarray oder einem beliebigen unterstützten systemeigenen Typen ersetze.
Dies warf mich ab, da ich erwartet hatte, dass die Verwendung der Standardbibliothek bei allen Implementierungen gleich ist.
Ich verstehe den Kompilierfehler und weiß, wie man es mit Hilfe von c_str() beheben kann.

Aber es würde mir sehr helfen, wenn jemand klären könnte, warum die Verwendung der Standardbibliothek plattformübergreifend ist.
Für mich ist es nicht mehr Standard!

EDIT: Code aktualisiert, um abgeschlossen zu sein. Der Inhalt von myFile.txt wurde aktualisiert.

+0

Was ist 'myFile '? Sie haben keinen definiert. Wenn ot 'inputStream' ist, hat letzterer kein' open' ohne Argumente. – Lol4t0

+0

@ Lol4t0 Code aktualisiert, um abgeschlossen zu sein. Außerdem ist der Modus standardmäßig ios_base :: in. Referenz unter: http://www.cplusplus.com/reference/iostream/ifstream/open/ –

+0

@JerryCoffin: Machen Sie als die Antwort, ich bin von diesem gebissen vor –

Antwort

4

Wahrscheinlich haben Sie #include <string> vergessen. Ohne es, Microsofts Version von <iostream> (und so) enthalten genug einer Erklärung von std::string für einige Dinge zu arbeiten, aber andere Teile fehlen, so dass Sie seltsame, scheinbar unerklärliche Fehler bekommen.

Eines der Dinge, die fehlen, ist die meisten Überlastungen des Bedieners für std::string, die genau das ist, was Sie zu fehlen scheinen.

Als beiseite, while (myfile.good()) ... ist so ziemlich ein garantiert Bug - Sie wollen wahrscheinlich:

while (myfile>>myString) 
    std::cout << myString << " \n"; 

Alternativ könnten Sie den Job mit einem Standard-Algorithmus tun:

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

int main() { 
    std::ifstream myfile("input.txt"); 

    std::copy(std::istream_iterator<std::string>(myfile), 
       std::istream_iterator<std::string>(), 
       std::ostream_iterator<std::string>(std::cout, " \n")); 
    return 0; 
} 
0

Nachfolgend stellt für mich auf MSVC 2010 fein:

std::ifstream inputStream; 
std::string myString; 
inputStream.open("myFile.txt", std::ifstream::in); 

while(inputStream.good()) 
{ 
    inputStream >> myString; 
}

Hinweis: ohne std::ifstream::in als meine offenen Modus, habe ich den gleichen Fehler wie Sie. Ich schlage vor, Sie überprüfen, welchen Wert Sie für diesen Parameter haben.

+0

Ich bin sicher, dass der Clip nicht kompiliert wird, da Sie keine Anweisungen in filescope (nur Deklarationen) haben können. Sowohl Sie als auch @Vinshnu liefern nicht den gesamten relevanten Code. –

+0

@LokiAstari Code mit Eingabedateien aktualisiert. –

+0

@Saul Die offene Methode wird standardmäßig auf ios_base :: in gesetzt. http://www.cplusplus.com/reference/iostream/ifstream/open/ –