2009-04-28 9 views
7

Ich habe die ganzen ifstream-Fragen hier auf SO und ich habe immer noch Probleme beim Lesen einer einfachen Textdatei. Ich arbeite mit Visual Studio 2008.ifstream :: open funktioniert nicht im Debug-Modus von Visual Studio

Hier ist mein Code:

// CPPFileIO.cpp : Defines the entry point for the console application. 
// 

#include "stdafx.h" 
#include <fstream> 
#include <conio.h> 
#include <iostream> 
#include <string> 

using namespace std; 


int _tmain(int argc, _TCHAR* argv[]) 
{ 

    ifstream infile; 
    infile.open("input.txt", ifstream::in); 

    if (infile.is_open()) 
    { 
     while (infile.good()) 
      cout << (char) infile.get(); 
    } 
    else 
    { 
     cout << "Unable to open file."; 
    } 
    infile.close(); 
    _getch(); 
    return 0; 
} 

ich bestätigt habe, dass die input.txt Datei im richtigen „Arbeitsverzeichnis“ wird durch den Wert von argv[0] überprüfen. Die Open-Methode wird einfach nicht funktionieren.

Ich habe auch Probleme beim Debuggen - sollte ich nicht in der Lage sein, eine Uhr auf infile.good() oder infile.is_open() zu setzen? Ich erhalte

Error: member function not present. 

EDIT: aktualisierte Codeliste mit vollständigem Code von CPP-Datei.

UPDATE: Die Datei war nicht im aktuellen Arbeitsverzeichnis. Dies ist das Verzeichnis, in dem sich die Projektdatei befindet. Es wurde dorthin verschoben und es funktioniert beim Debuggen in VS.NET.

+0

Es ist das Arbeitsverzeichnis, das Ihr Problem ist. Wenn Sie es von der Befehlszeile ausführen, ist das Arbeitsverzeichnis offensichtlich. Wenn Sie es im Debugger ausführen, müssen Sie das Arbeitsverzeichnis explizit festlegen, andernfalls ist es nicht so offensichtlich (überprüfen Sie die Debugger-Optionen). –

+0

Danke für das Posten des Update-Abschnitts. Es war eine Minute her, seit ich darüber nachdenken musste, wo sich das Arbeitsverzeichnis im Debug-Modus befindet. Rettete mir ein paar Minuten Kopf kratzen. –

Antwort

8

Versuchen Sie, den bitweisen OR-Operator zu verwenden, wenn Sie den offenen Modus angeben.

infile.open ("input.txt", ios::ate | ios::in); 

Der openmode Parameter ist eine Bitmaske. ios::ate wird verwendet, um die Datei zum Anhängen zu öffnen, und ios::in wird verwendet, um die Datei zum Lesen der Eingabe zu öffnen.

Wenn Sie nur die Datei lesen möchten, können Sie wahrscheinlich nur verwenden:

infile.open ("input.txt", ios::in); 

Der Standardöffnungsmodus für eine ifstream ios ist :: in, so dass man insgesamt davon loswerden jetzt. Der folgende Code funktioniert für mich mit g ++.

#include <iostream> 
#include <fstream> 
#include <cstdio> 

using namespace std; 

int main(int argc, char** argv) { 
    ifstream infile; 
    infile.open ("input.txt"); 

    if (infile) 
    { 
     while (infile.good()) 
      cout << (char) infile.get(); 
    } 
    else 
    { 
     cout << "Unable to open file."; 
    } 
    infile.close(); 
    getchar(); 
    return 0; 
} 
+0

Heh. Manchmal wünschte ich, mein Repräsentant wäre hoch genug, um eine Antwort für jemand anderen zu akzeptieren. :-) –

+0

Noch kein Glück :( Ich bemerkte, dass ich die "infile" als "fstream" anstelle von "ifstream" hatte. Ich entfernte die ios: ate. Die offene Methode funktioniert immer noch nicht. –

+0

Bizarre! Es funktioniert nicht, wenn ich debugge, aber es funktioniert einwandfrei, wenn ich die Debug.exe über eine Befehlszeile ausführen! Irgendwelche Ideen warum? –

0
infile.open ("input.txt", ios::ate || ios::in); 

|| ist die logische OR-Operator, nicht der bitweise Operator (wie Bill Die Lizzard gesagt).

also denke ich Ihnen das Äquivalent zu tun:

infile.open ("input.txt", true); 

(weder ios vorausgesetzt :: aß oder ios :: in sind 0)

0

Versuchen Sie es mit:

ifstream fStm("input.txt", ios::ate | ios::in); 

I'm also having trouble debugging- should I not be able to set a watch on "infile.good()" or "infile.is_open()"? I keep getting "Error: member function not present."

und die richtigen enthält:

#include <fstream> 

usw.

+0

Ich habe die # in meiner cpp-Datei enthalten. –

+0

Sie müssen uns die komplette Datei zeigen, um Ihr zweites Problem zu beheben. Übrigens, konnten Sie die Datei einlesen? – dirkgently

+0

Aktualisiert mit vollem Code. –

1

ich zwei Probleme im Code gefunden haben:

a) Syntaxfehler in "ios :: ate || ios :: in" => sollte "ios :: ate | ios :: in"

b) "ios :: ate" setzt auf das Ende der Datei den Cursor - damit Sie nichts, wenn Sie

so einfach entfernen "ios :: ate" anfangen zu lesen und Sie sind fein :)

ciao, Chris

4

Manchmal entfernt Visual Studio Ihre EXE-Datei von Ihrem Quellcode. Standardmäßig sucht VS nur nach der Datei, die mit Ihrer EXE-Datei beginnt. Dieser Prozess ist ein einfacher Schritt, um die Eingabe-TXT-Datei aus dem gleichen Verzeichnis wie Ihren Quellcode zu erhalten. Sollten Sie das IDE-Setup nicht reparieren wollen.

using namespace std; 

ifstream infile; 

string path = __FILE__; //gets source code path, include file name 
path = path.substr(0,1+path.find_last_of('\\')); //removes file name 
path+= "input.txt"; //adds input file to path 

infile.open(path); 

Hoffentlich hilft dies anderen Menschen für eine schnelle Lösung. Es hat eine Weile gedauert, bis ich dieses Setup gefunden habe.