2016-05-19 9 views
-2

so das könnte eine sehr offensichtliche Frage für einige sein, aber ich habe keine Ahnung, wo auf diesen Fehler zu starten.C++ Stoi sendet manchmal Ausnahme mit Leerzeichen

Ich habe einige Code, der einige Zeichenfolgen aus einer TXT-Datei liest, alle Zeichenfolgen haben ein ":" und dann nach einer Zahl. Beispiel:

Objekte pro Farbe: 1

Anzahl der Roboter: 10

Vordefinierte Positionen: 1

Wenn ich die Werte von Hand bearbeiten, die stoi funktioniert gut, aber wenn aC# -Code schreibt die Werte in die selbe Datei (beachten Sie, dass ich manuell überprüft habe, und es gibt identische, keine zusätzlichen Leerzeichen, keine zusätzlichen Zeichen, nichts visuell anders) beschwert sich der stoi. Mein Code ist die nächste:

C++:

cout << "Number..." << endl; 
cout << dataLine.substr(dataLine.find_first_of(":")+1) << endl; 
try{ 
    cfgVals.push_back(stoi(dataLine.substr(dataLine.find_first_of(":")+1)));  
}catch(exception& ex){ 
    cout << ex.what() << endl; 
} 

In beiden Fällen sind die cout von Datenleitung einen Raum sendet und dann die Nummer "1" oder "10". Wenn die Datei von mir bearbeitet wird, löst stoi keine Ausnahme aus, sondern bearbeitet sie mit dem anderen Programm, tut es aber (und trotzdem scheint es die Konvertierung richtig zu machen).

Der Befehl, den ich verwende, um die Datei in C# zu schreiben, ist sehr einfach:

File.WriteAllLines(@nameFile, param); 

Wo param eine Liste von Strings ist.

Hoffe ich bin klar genug, irgendeine Idee? Danke im Voraus!

+1

Haben Sie schon einmal über den Charakter kodieren in Betracht ziehen? vielleicht schreibt Ihre "C#" Datei als 'UTF-8', und wie ich weiß 'stoi' beschäftigt sich mit 'ASCII' –

+0

Was ist die Ausnahme - d. h. was gibt ex.what() zurück? –

+0

@Freeman Zhang, du könntest etwas vorhaben ... Ich werde mir das ansehen. – gkapellmann

Antwort

1

Wenn Sie sehen, dass das Verhalten Ihres C++ Programms von einem Programm abhängt, das eine Eingabedatei erstellt, sollten Sie überprüfen, welche Kodierung dieses C# -Programm verwendet und welche Kodierung Sie verwenden, um die Datei vom Textprozessor zu speichern. Sie können hier auch Code von C# -Programm senden, das diese Datei erstellt.

+0

Vor langer Zeit bekam ich diese Antwort und ich konnte es beheben. In der Tat war es eine falsche Kodierung! – gkapellmann

0

Ja, stoi wirft eine Ausnahme, wenn es keine Eingabe erhält, kann es in eine ganze Zahl umgewandelt werden - ein Leerzeichen ist keine Zahl und kann auch nicht Teil einer Zahl sein. Sie können den Eingang trimmen, indem Sie den Platz vor dem Füttern entfernen und das sollte Ihr Problem lösen.

string trim(string num) 
{ 
    string res = ""; 
    if (num[0] == ' ') { 
    res = num.substr(1); 
    } 
    return res; 
} 

dies sollte die Arbeit machen, dass vor der Annahme ist der einzige Ort, um die Leerzeichen haben

Verwandte Themen