2013-03-19 5 views
2

Ok, donc j'ai un énorme fichier que je veux lire dans 1 chapitre à la fois. un chapitre est délimité par '$'. Je ne suis pas vraiment familier avec C++ pour le moment, donc j'ai fait quelque chose qui serait lu dans un chapitre comme je l'attendrais en C/C++.C++ lire le fichier texte jusqu'à un délimiteur spécifique

#include <nds.h> 
#include <stdio.h> 
#include <string> 
#include <vector> 
#include <sstream> 

int dataFileLoc = 7; 

std::string fileReader(){ 
    FILE * dataFile; 
    std::string chapterBuffer = ""; 
    const int buffersize = 1024; 
    char charBuffer[buffersize]; 
    bool foundEnd = false; 
    dataFile = fopen("xc3_.tsc", "rt");//open data file 
    fseek(dataFile,dataFileLoc,SEEK_SET); 
    while(!foundEnd){ 
     fread(charBuffer,1,buffersize,dataFile); 
     for(int i=1; i<buffersize; i++){ 
      if(charBuffer[i] == '$'){ 
       foundEnd = true; 
       charBuffer[i] = '\0'; 
       dataFileLoc = ftell(dataFile)-(buffersize-i); 
       break;//break to spare some time 
      } 
     } 
     chapterBuffer.append(charBuffer); 
    } 
    fclose(dataFile);//done with the file for now. 

    checkerTemp(chapterBuffer); 

    return chapterBuffer; 
} 

Le résultat devrait être bon. Je n'ai jamais encore atteint la fin du fichier. donc il pourrait échouer là. Cependant, il semble apparemment aléatoire (cohérente, mais à des endroits apparemment aléatoires). L'échec entraînerait une injection de données indésirables dans la chaîne (valeur de 8 caractères), suivie par des données normales à nouveau.

Est-ce que quelqu'un a une idée de ce qui pourrait causer cela, ou quelqu'un a-t-il une bonne façon de le faire en C++? Quelque chose avec un lecteur de chaîne?

Merci à l'avance,

-Smileynator

+2

Extrayez ['std :: getline'] (http://fr.cppreference.com/w/cpp/string/basic_string/getline). Et bien sûr, vous devriez en apprendre davantage sur le C++ [installations d'entrée/sortie] (http://en.cppreference.com/w/cpp/io). –

+2

Utilisez 'getline (file, data, '$')', remplacez vingt lignes de code par une. – john

+0

Le premier caractère du tampon n'est pas analysé. Utilisez 'for (int i = 0; ...' – suspectus

Répondre

2

Une erreur est que si votre boucle while, boucles autour, l'instruction

chapterBuffer.append(charBuffer); 

va tenter d'ajouter un caractère pas terminé tampon dans le chapterBuffer - pas une bonne chose. Vous devrez maintenir dans la boucle for si vous avez trouvé le '$'; Si vous ne l'avez pas fait, vous devrez terminer le charBuffer; Ou vous pouvez allouer buffersize + 1 octets pour charBuffer et définir le charBuffer [buffersize] = '\ 0' avant la boucle;

+0

Cela semble être une réponse très logique, je vais le tester quand je rentre à la maison! à la recherche de quelque chose comme ça, mais je ne l'ai pas trouvé par moi-même! – Smileynator

3

Vous utilisez l'API du fichier C, vous devez utiliser l'API C++ iostream.

Pour lire dans un chapitre, vous devez utiliser std::getline avec '$' comme argument de délimiteur. Cela signifie que vous n'avez pas besoin de vous soucier de l'allocation du tampon car l'objet chaîne l'alloue automatiquement.

La boucle devient également très simple.

while(std::getline(strm, str, '$').good()) 
    do_something_with_chapter(str); 
+0

Le '.good()' n'est pas nécessaire. – XTF

Questions connexes