2009-06-11 14 views
0

Ich habe eine C++ - Quelldatei gefunden, die Ausdrücke aus einem Befehlszeilenargument (argv [1]) berechnet, aber jetzt möchte ich es ändern, um eine Datei zu lesen.C++ - FILE * in CHAR konvertieren *

double Utvardering(char* s) { 
srcPos = s; 
searchToken(); 
return PlusMinus(); 
} 

int main(int argc, char* argv[]) { 
if (argc > 1) { 
    FILE* fFile = fopen(argv[1], "r"); 
    double Value = Utvardering(fopen(argv[1], "r")); 
    cout << Value << endl; 
}else{ 
    cout << "Usage: " << argv[0] << " FILE" << endl; 
} 
cin.get(); 
return 0; 
} 

Die Utvardering-Funktion erfordert jedoch einen char * -Parameter. Wie kann ich die aus einer Datei gelesenen Daten in ein char * umwandeln?

+0

Art lustig, aber ich vermute, Utvardering() sollte die schwedische Utvärdering(), was Evaluation() bedeutet. Nicht oft sieht man schwedische Wörter im Code und vor allem nicht auf SO :) – ralphtheninja

Antwort

5

Die Funktion fopen öffnet nur eine Datei. Um eine Zeichenfolge von dort zu erhalten, müssen Sie die Datei lesen. Dazu gibt es verschiedene Möglichkeiten. Wenn Sie die maximale Größe der Zeichenfolge im Voraus wissen, würde dies tun:

const int MAX_SIZE = 1024; 
char buf[MAX_SIZE]; 
if (!fgets(buf, MAX_SIZE, fFile) { 
    cerr << "Read error"; 
    exit(1); 
} 
double Value = Utvardering(buf); 

Hinweis: Diese Methode für C typisch ist, nicht für C++. Wenn Sie mehr idiomatische C++ Code möchten, können Sie so etwas wie dieses (statt FILE und fopen) verwenden:

ifstream in;  
in.open(argv[1]); 
if (!in) { /* report an error */ } 
string str; 
in >> str; 
+0

Wo wird MAX_SIZE deklariert? –

+0

Sie können MAX_SIZE entweder als Konstante im Body der Funktion oder als globale Konstante deklarieren. In der Regel, je weniger Unordnung im globalen Namensraum, desto besser, also legen Sie es einfach in die Hauptfunktion. Ich habe das Beispiel aktualisiert, siehe oben. –

+0

Das erste Beispiel setzt es nicht auf char *, irgendwelche Ideen? –

1

Ich habe keine Ahnung, was "Utvardern" erwartet, oder wie es die Informationen verwendet.

Es gibt zwei Möglichkeiten -

1) Utvärdering definiert werden kann char * verwenden, sondern eine Datei * (in der Tat erwartet, char * wie nichtig Behandlung *). Ich habe das schon mal gesehen, obwohl es ziemlich übel ist. In diesem Fall müssen Sie einfach fFile an char * übergeben und übergeben.

2) Das Utvardering erwartet möglicherweise eine nullterminierte Zeichenfolge (char *) als Eingabe. Wenn Sie fopen so verwenden, können Sie fread verwenden, um den Inhalt der Datei in einen Puffer (char []) einzulesen und ihn an Ihre Funktion zu übergeben, die char * benötigt.

6

Verwenden Sie die Funktion fread(), um Daten aus der Datei * in einen Puffer zu lesen. Senden Sie diesen Puffer in Utvardering().

+0

Denken Sie daran, fclose() danach! –

0

Es sieht so aus, als müssten Sie Code schreiben, um die Datei in ein Zeichenarray zu lesen und an Utvardering weiterzuleiten.

Wenn Sie nur den Rückgabewert fopen übergeben, wird die Adresse der undurchsichtigen Datenstruktur, auf die der Zeiger zeigt, an Utvardering übergeben. Utvardering behandelt diese Bytes gerne als Zeichendaten, wenn dies nicht der Fall ist. Nicht gut.