Wie komme ich seltsame Ergebnisse mit istream bin immer :: get (char *, stream n, char delim)?

StackOverflow https://stackoverflow.com/questions/1943481

  •  20-09-2019
  •  | 
  •  

Frage

Ich lese in einer Datei mit einem Format ähnlich wie:

TIME, x, y, z
00:00:00.000 , 1, 2 , 3
00:00:00.001 , 2 , 3 , 4

usw. und Code ähnlich dem folgenden:

std::ifstream& istream;
char buffer[15];
double seconds, hours, mins; // initialised properly in real code

// to read in first column
istream.get(buffer, 14, ',');

int scanned = std::sscanf(buffer, "%d:%d:%lf", &hours, &mins, &seconds);

Es liest in der ersten Spalte in Ordnung für die meiste Zeit. Jedoch gelegentlich die sscanf ausfällt, und wenn ich zu überprüfen, was im Puffer CodeGear mit Debugger sehe ich, dass es in \000:00:023 zum Beispiel gelesen hat. Aus irgendeinem Grunde ist es ein Null-Zeichen, \0, an der Front zu sammeln. Wenn ich in der Textdatei aussehen, scheint es das gleiche Format wie alle anderen Zeitwert zu sein, die in richtig gelesen wurden. Warum ist es das Hinzufügen gelegentlich ein Null-Zeichen? Und gibt es eine Arbeit um?

War es hilfreich?

Lösung

Sie haben eine leere Zeile lesen, oder Sie versuchen, über das Ende der Datei zu lesen.

Das erste Zeichen ist \0, das das Ende der Zeichenfolge bedeutet.

Alle Zeichen danach sind unangetastet Speicher.

Andere Tipps

versuchen, dies und sieht ..

ifstream inpfile("sample.txt");
char buffer[15];
inpfile.ignore(80, '\n');
while (!inpfile.eof())
{

    inpfile.get(buffer, 14, ',');
    int hrs, mins;
    double secs;
    hrs = mins = secs = -1;
    sscanf_s(buffer, "%d:%d:%lf", &hrs, &mins, &secs);
    cout << "hrs:" << hrs << "\t"
        << "mins:" << mins << "\t"
        << "secs:" << secs 
        << endl;
    inpfile.ignore(80, '\n');
}

wahrscheinlich haben Sie ein Komma in Ihrer Eingabedatei irgendwo. oder vielleicht mehr als 14 Zeichen von Leerzeichen nach der letzten Nummer auf einer Linie.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top