2017-05-19 2 views
0

Ich habe einen Code, der einen Dateinamen xxx von commands.in liest und speichert es in einer Zeichenfolge, nennen Sie es string name.Fehler beim Öffnen des Dateinamens in Zeichenfolge C++

Ich möchte xxx öffnen, da es auch eine Datei ist, so dass ich verketten .data bis zum Ende davon (da alle meine Dateien mit .data Ende), so kann es wie so geöffnet werden.

string filename = name + ".data";

Jetzt ouput ich diese Zeichenfolge an die Konsole und es liest xxx.data, so dass ich weiß, dass es richtig verkettet. Wenn ich jedoch versuche, eine Datei mit der Zeichenfolge zu öffnen, bekomme ich immer die Fehlermeldung "Datei existiert nicht". Das ist, was ich tue:

fstream fileObj;

fileObj.open(filename.c_str()); (die xxx.data ist) Dies ist, dass die Datei nicht existiert. Wenn ich die Datei nach ihrem tatsächlichen Namen fileObj.open("xxx.data"); öffne, findet sie die Datei kein Problem und macht die Operationen, die ich will. Die Zeichenfolge, die ich in das Argument .open einfüge, entspricht genau der tatsächlichen Eingabe, aber es funktioniert nicht. Irgendeine Idee warum das sein könnte?

#include <iostream> 
#include <fstream> 
#include <string> 
//#include "Cache.h" 

using namespace std; 



double Avg(string fileName); 
int Min(string fileName); 
int Max(string filename); 
int Med(string filename); 




int main(){ 

    int numFile; 
    string fileName; 
    string opName; 
    fstream fileObj; 
    double avgVal; 
    cout << "\n\n\n\n\n\n\n\n\n\n" << endl; 
    fileObj.open("commands.in"); 

    fileObj >> numFile; 


    for (int i = 0; i < numFile; i++){ 
    fileObj >> fileName; 
    fileObj >> opName; 



    if (opName == "Avg") 
     { 
     cout << "\n\nFilename = " << fileName<<endl; 
     cout << "going for avg here"<<endl; 
     avgVal = Avg(fileName); 
     cout << avgVal; 

    } 

    return 0; 
} 

double Avg(string filename) 
{ 
    cout << "ENTERED AVG METHOD" << endl; 
    fstream file; 
    string name = filename + ".data"; 
    // file.open(filename.c_str()); 
    file.open("A.data"); 
    if (file.fail()) 
    { 
     cout << "The file was not found" << endl; 
     return 0; 
    } 
    int count = 0; 
    double allNum = 0; 
    double current; 
    double result; 
    cout << "\nFilename goes here : " << name << endl; 
    while(file) 
    { 
     file >> current; 
     allNum += current; 
     count +=1; 
    } 
    cout << "\n\n COUNT SHOULD BE 6 : " << count << endl; 

    result = allNum/count-1; 

    return result; 
} 

commands.in

6 
A Avg 
B Max 
C Med 
A2 Avg 
B Max 
ABC Min 

A.data

20 
20 
30 
30 
40 
40 
+1

können Sie Ihre 'name' nur printf, bevor Sie versuchen, die Datei zu öffnen nur um sicher zu gehen? .. – Pavel

+0

Ich habe den Namen vorher gedruckt, und es ist genau das gleiche. Wenn der Name der Datei "xxx.data" ist, drucke ich das genauso wie die Verkettung und sie sind gleich. – Podo

Antwort

1
  • vergessen Haben Sie Ihr filename statt name zu benutzen?

  • Haben Sie überprüft, ob Ihr name ein abschließendes Zeilenvorschubzeichen hat?

Log es zitiert, um sicherzustellen, dass Sie versuchen, richtige Datei zu öffnen:

printf("filename: '%s'\n", filename.c_str()); 

Dieser Code sieht nicht ok:

string name = filename + ".data"; 
    // file.open(filename.c_str()); 
    file.open("A.data"); 

Ihre commands.in hat A. Daten und Sie anhängen .data und dann verwenden Sie immer noch filename und nicht name. Ziemlich verwirrend. Ändern Sie das alles folgendermaßen:

cout << "Open file: ==>\"" << name << "\"<==\n"; 
    file.open(name.c_str()); 
+0

Die hier verwendeten Namen sind willkürlich. Lass mich überprüfen, was ich geschrieben habe, was ich meine .. – Podo

+0

sag dir was, ich werde einfach den Code laden. gib mir eine Sekunde muss von einem Linux-VM-Server – Podo

1

Überprüfen Sie, ob die Datei, mit der Sie arbeiten, sich im selben Verzeichnis wie Ihr aktuelles Arbeitsverzeichnis befindet. Sie könnten fileObj.open(filename.c_str()); mit einem absoluten Pfad wie zur Verfügung stellen mögen:

string filename = "C:\\Users\\Username\\Desktop\\filename.data"

Wenn die Datei nicht im selben Verzeichnis nicht existiert, wie Ihr aktuelles Arbeitsverzeichnis und Sie nicht den vollständigen Pfad bereitstellt, dass Fehler wird immer wieder auftauchen.

Versuchen Sie auch, Hartcodierung auf den Dateinamen in sicher zu sein, es keine Zeile Abbrechern in der Zeichenfolge sind:

fileObj.open("C:\\Users\\Username\\Desktop\\filename.data");

+0

übertragen Es ist eine Linux-Maschine, aber ja, sie sind absolut im selben Verzeichnis. Deshalb funktioniert das Eintippen korrekt, die Übergabe als String jedoch nicht. – Podo

+1

@ JeffreyDilley Es sollte egal sein, woher der Name kommt, sie werden auf die gleiche Weise interpretiert. Und es ist nicht relativ zum Verzeichnis der ausführbaren Datei, es ist relativ zu Ihrem aktuellen Arbeitsverzeichnis. – Barmar

+0

@Barmar Ich verstehe das. Ich bin positiv Verzeichnis ist nicht das Problem obwohl:/ – Podo

Verwandte Themen