2017-03-02 2 views
1

Ich versuche eine Datei zu lesen, wo die erste Zeile eine Ganzzahl ist, und die nächste Zeile ist eine Zeichenfolge (ich muss dies in ein Char-Array lesen). Ich habe den Operator >> für das Eingabe-Stream-Objekt verwendet, um die ganze Zahl zu lesen, dann habe ich die .get() -Methode und die .ignore() -Methode verwendet, um die nächste Zeile in ein char-Array zu lesen das Char-Array Ich bekomme eine leere Zeichenfolge Ich bin mir nicht sicher, warum ich eine leere Zeichenfolge, wissen Sie, warum das sein könnte?Problem beim Lesen von Datei in C++

Hier ist der Code, den ich aus der Datei zu lesen und benutze

BookList::BookList() 
{ 
    //Read in inventory.txt and initialize the booklist 
    ifstream invStream("inventory.txt", ifstream::in); 
    int lineIdx = 0; 
    int bookIdx = 0; 
    bool firstLineNotRead = true; 

    while (invStream.good()) { 
     if (firstLineNotRead) { 
      invStream >> listSize; 
      firstLineNotRead = false; 
      bookList = new Book *[listSize]; 
      for (int i = 0; i < listSize; i++) { 
       bookList[i] = new Book(); 
      } 

     } else { 
      if (lineIdx % 3 == 0) { 
       char tempTitle[200]; 
       invStream.get(tempTitle, 200, '\n'); 
       invStream.ignore(200, '\n'); 
       bookList[bookIdx] = new Book(); 
       bookList[bookIdx]->setTitle(tempTitle); 
      } else if (lineIdx % 3 == 1) { 
       int bookCnt; 
       invStream >> bookCnt; 
       bookList[bookIdx]->changeCount(bookCnt); 
      } else if (lineIdx % 3 == 2) { 
       float price; 
       invStream >> price; 
       bookList[bookIdx]->setPrice(price); 
       bookIdx++; 
      } 
      lineIdx++; 
     } 
    } 
} 

so Listsize ist die erste ganze Zahl, die von der ersten Zeile in der Datei gelesen wird, und tempTitle ist ein temporärer Puffer zum Lesen in der Zeichenfolge aus der zweiten Zeile der Datei. Aber wenn ich invStream.get() und invStream.ignore() mache, sehe ich, dass die tempTitle-Zeichenfolge leer ist. Warum?

+2

über die erste Denken '\ n 'nach Ihrer ganzen Zahl in der ersten Zeile. –

+0

Stellen Sie eine Beispieldatei zur Verfügung? – everettjf

+0

Warum benutzt du 'getline()' nicht? –

Antwort

1

Sie können am ehesten Ihr Programm beheben, indem die Linien Swapping

invStream.get(tempTitle, 200, '\n'); 
invStream.ignore(200, '\n'); 

dh Verwendung:

invStream.ignore(200, '\n'); 
invStream.get(tempTitle, 200, '\n'); 

Als allgemeine Richtlinie gilt, wenn der Inhalt einer Datei so formatiert sind, dass Linien Text hat eine spezifische Bedeutung, es ist einfacher für Sie, den Inhalt der Datei Zeile für Zeile zu lesen und den Inhalt jeder Zeile zu verarbeiten.

std::string line; 
while (getline(invStream, line)) { 

    if (firstLineNotRead) { 
     // Extract the listSize from the first line using 
     // a istringstream. 
     std::istringstream str(line); 
     str >> listSize; 
     firstLineNotRead = false; 
     bookList = new Book *[listSize]; 
     for (int i = 0; i < listSize; i++) { 
     bookList[i] = new Book(); 
     } 
    } 

    else { 
     // The line has already been read. 
     // Use it. 

     ... 

    } 
} 
3

Nachdem Sie die erste Ganzzahl aus der Datei gelesen haben, befindet sich eine neue Zeile in der Datei, die darauf wartet, gelesen zu werden.

Sie fahren dann fort, es zu sagen, um eine Zeichenfolge zu lesen. Es tut so - interpretiert die neue Zeile als das Ende der Zeichenfolge, so dass die Zeichenfolge, die Sie lesen, leer ist.

Danach ist alles aus dem Lot, so dass der ganze Rest der Lektüre so gut wie scheitern wird (zumindest nicht erreichen, was Sie wollen).

Als Nebenwirkung, würde ich über eine Aufgabe wie diese gehe eher anders - wahrscheinlich eher wie diese:

#include <iostream> 
#include <vector> 
#include <bitset> 
#include <string> 
#include <conio.h> 

class Book { 
    std::string title; 
    int count; 
    float price; 
public: 

    friend std::istream &operator>>(std::istream &is, Book &b) { 
     std::getline(is, title); 
     is >> count; 
     is >> price; 
     is.ignore(100, '\n'); 
     return is; 
    } 
}; 

int main() { 
    int count; 

    std::ifstream invStream("inventory.txt"); 

    invStream >> count; 
    invStream.ignore(200, '\n'); 

    std::vector<Book> books; 

    Book temp; 

    for (int i = 0; i<count && invStream >> temp;) 
     books.push_back(temp); 
}