2012-04-10 11 views
0

EDIT - es gibt keine leeren Zeilen. EDIT 2 - mein Schlechter, es scheint, ich lag die ganze Zeit falsch. Es gibt irgendwo eine Leerzeile, obwohl die CSV-Datei etwas anderes anzeigt. Es funktioniert jetzt. Okay, so ist hier das gesamte (kurz) Programm:Mit C++, warum bekomme ich die Fehlermeldung "Zeichenfolge Subskript außerhalb des Bereichs", wenn ich weiß, dass es nicht ist? Oder zumindest scheint es so

#include <iostream> 
#include <cctype> 
#include <string> 
#include <fstream> 
using namespace std; 

int main(){ 
    char a; 
    string stringmanip; 

    fstream myfile("readthisfile.csv"); 
    if (myfile.is_open()){ 
     while (myfile.good()){ 
      getline(myfile,stringmanip); 
      a=stringmanip[0]; 
     } 
     myfile.close(); 
    } 
    else cout<< "Unable to open file"; 

    return 0; 
} 

Es macht keinen Sinn für mich. Ich kann stringmanip kopieren, ich kann stringmanip streichen, ich kann .substr mit stringmanip verwenden. Wenn ich eine reguläre Zeichenfolge definiere, kann ich die Operation [] einfach verwenden. Ich habe auch .at versucht, aber das führt nur zu einem anderen Fehler. (Außer Reichweite).

Jede Hilfe wäre sehr geschätzt. Entschuldigung, ich bin so ein Anfänger, wie du sicher weißt.

Danke, Ben

+3

Enthält Ihre Datei Leerzeilen? Auch das System ("pause"); [bitte loswerden] (http://www.gidnetwork.com/b-61.html);. (Ich habe fast Ihren Code ausgeführt, um es zu testen, und auf meinem System gibt es einen Befehl namens "Pause", der das Kühlsystem an meinem Heimreaktor abschaltet.) –

+0

Entschuldigung, ich habe es losgeworden. Nein, es enthält keine Leerzeilen. – Ben

Antwort

4

Wenn readthisfile.csv eine leere Zeile am Ende der Datei (oder irgendwo in der Datei) hat, dann werden Sie einen leeren String zurück. Sie können das 0. Zeichen einer leeren Zeichenfolge nicht dereferenzieren. string::operator[] akzeptiert nur Indizes von 0 bis string::length() - 1. Wenn Sie eine leere Zeichenfolge haben, führt jeder Aufruf von string::operator[] zu einem nicht definierten Verhalten.

+4

+1 Auch 'while (myfile.good())' sollte 'while (getline (myfile, stringmanip))' sein. Ich wünschte, das ganze 'while (! Stream.eof())'/'while (stream.good())' antipattern würde einfach schon sterben. – ildjarn

+0

Haha, kann nicht betonen, wie neu ich bin, tut mir leid. – Ben