2009-07-26 26 views
1

Ich versuche, von Dateien außerhalb des Programms zu lesen, habe aber einige Probleme. Das Programm hat den Benutzer eine Datei erstellen. Dann liest es Wörter aus zwei TXT-Dateien, die außerhalb des Programms erstellt wurden, und schreibt dann die Wörter in die erstellte Datei.Lesen von Daten von außerhalb erstellt von

#include "std_lib_facilities.h" 

int main() 
{ 
    string word; 

    cout << "Create file.\n"; 
    char name[20]; 
    cin >> name; 
    ofstream ost(name, ios::out); 

    cout << "Open first file.\n"; 
    char filename[20]; 
    cin >> filename;  
    ifstream ist(filename); 
    while(ist >> word) ost << word << " "; 
    ist.close(); 

    cout << "Open second file.\n"; 
    cin >> filename; 
    ifstream isttwo(filename); 
    while(isttwo >> word) ost << word << " "; 
    isttwo.close(); 

    ost.close(); 

    keep_window_open(); 
} 

Wenn ich jedoch die erstellte Datei im Editor öffnen, wird es leer angezeigt. Liegt das daran, dass das Lesen in eine Zeichenfolge unmöglich ist, weil die gelesenen Dateien separat erstellt wurden? Ich bin mir nicht wirklich sicher. Jede Hilfe wird geschätzt.

+1

Haben Sie überprüft, dass die Schleifen überhaupt ausgeführt werden? ost könnte leer sein, einfach weil das Öffnen von und aus zwei Gründen fehlschlägt. – Sean

+0

Ja, das ist das Problem. Ich glaube nicht, dass die Wörter aus der TXT-Datei in Word gelesen werden. Ich muss wissen, wie man die Wörter liest. Als ich es prüfte, fügte ich gerade ein cout << Wort in der while Schleife hinzu, aber nichts kam auf. – trikker

+0

Ich habe gerade diesen Code ausprobiert und es hat perfekt funktioniert. Sind Sie sicher, dass sich die Eingabedateien im richtigen Verzeichnis befinden? (Sie sollten sich im selben Verzeichnis befinden, in dem die Ausgabedatei erstellt wird.) – Sean

Antwort

1

Der Code ist korrekt. Achte nur darauf, dass du beim Schreiben des Namens der ersten Datei und der zweiten Datei auch ihre Erweiterungen schreibst. Zum Beispiel:

first.txt 
second.txt 
+0

Es funktionierte korrekt, wenn ich Dateiformate einschloss. – trikker

0

Ein potenzielles Problem ist die Verwendung von cin anstelle von getline.

diesen Eingang Stellen Sie sich vor:

Open second file. 
>>file one.txt 

Dies wird sich natürlich die Datei nicht öffnen Sie wollen, da das Lesen cin stoppt, sobald Sie einen Raum treffen.

Versuchen explizit Namen zu öffnen, wie zB:

ost.open(name); 

ich auch in der While-Schleifen für Ihre implizite Verwendung des >> Betreiber nicht. Versuchen Sie dies:

while (!ist.eof()) 
{ 
    getline(ist, word); 
    ost << word; 
} 
+0

Dies ist Übungscode, keine Absicht, die Fehlerbehandlung zu implementieren. – trikker

+0

Das cin-Objekt macht auch knifflige Dinge mit Leerzeichen, deshalb solltest du getline benutzen, auch wenn du das nicht für ein Problem hältst. – jkeys

+0

Wenn Sie meine Frage wirklich beantworten können, wäre das großartig, sonst sind Ihre Antworten nur Code-Optimierung, die für eine einfache Übung unnötig ist. – trikker

0

Vielleicht sollten Sie Null den Dateinamen [20] Zeichenfolge beenden. Wie Dateiname [20] = {0}; bevor es von der Standardeingabe kommt; Versuchen Sie dann, den Dateinamen auf der Konsole auszudrucken, um zu prüfen, ob der Dateiname OK ist.

+0

Nein, char * wird immer null terminiert, wenn Sie nicht versuchen, in das letzte Byte im Array zu schreiben. – jkeys

0

trikker,

Der Code mit unwesentlichen Änderungen kompilierte und ich kam in dem gleichen Problem, das Sie haben, wenn es tatsächlich funktioniert. Hier ist was mit mir passiert ist. Es hat damit zu tun, wie Sie das Programm ausführen. Die EXE-Datei wird im Verzeichnis ../ProjectDir/Debug gespeichert. Wenn Sie die zwei Eingabedateien im Debug-Verzeichnis speichern, sollten Sie das Programm von der Eingabeaufforderung ausführen, NICHT von der IDE (unter der Annahme von Visual Studio 2008). Wenn Sie es jedoch über die IDE ausführen, speichern Sie die beiden Eingabedateien in ../ProjectDir/ProjectDir. Sobald ich das gemacht habe, war alles in Ordnung mit mir.

Nur um sicher zu sein über diese Verzeichnis Sache, habe ich das Verzeichnis gedruckt, von dem das Programm von der IDE ausgeführt wird. Obwohl die Eingabeaufforderung anzeigt, dass die exe vom Debug-Verzeichnis ausgeführt wird, war das Arbeitsverzeichnis eigentlich ProjectDir/ProjectDir.

Wie auch immer, bitte, geben Sie den folgenden Code eine Chance und lassen Sie es uns wissen?

// # include „std_lib_facilities.h“

#include <fstream> 
#include <iostream> 
#include <cstdlib> 

using namespace std; 

int main() 
{ 
    system("cd"); 
    //string word; 
    char word[80]; 
    cout << "Create file.\n"; 
    char name[20]; 
    cin >> name; 
    ofstream ost(name, ios::out); 

    cout << "Open first file.\n"; 
    char filename[20]; 
    cin >> filename;  
    ifstream ist(filename); 
    while(ist >> word) ost << word << " "; 
    ist.close(); 

    cout << "Open second file.\n"; 
    cin >> filename; 
    cout << filename; 
    ifstream isttwo(filename); 
    while(isttwo >> word) ost << word << " "; 
    isttwo.close(); 

    ost.close(); 

    //keep_window_open(); 
} 

Dieses Verzeichnis Problem wahrscheinlich auch erklärt, warum Sie nichts bekommen hat, wenn versucht, aus zu drucken, wenn es überhaupt etwas zu lesen war. Sie sollten wahrscheinlich überprüft haben, ob die Erstellung der Eingabedatei erfolgreich war. Um das zu tun, fügen Sie einfach ... hinzu

if (ist.fail()){ 
    cout << "file open failed\n"; 
} 

nach

ifstream ist(filename) 
0

Was passiert, wenn Sie absolute Pfade verwenden? z.B. unter Windows versuchen Sie c:\file.txt und so weiter.