2017-01-13 4 views
-1

J'ai un problème de lecture des fichiers texte de mon répertoire.C++ Impossible de lire le fichier txt avec l'erreur de segmentation ifstream Erreur

Voici ma partie de l'exemple de code. (Si vous voulez, je peux télécharger le code tout)

ifstream file; 

// Get Total Number of Lines from a sample text file 
file.open(globLabel0.gl_pathv[0]); 
for (int i = 0; getline(file, line); ++i) 
    columnSize++; 
if(file.is_open()) 
    file.close(); 

float trainingData[trainingDataRowSize][columnSize]; 
float testData[testDataRowSize][columnSize]; 

// Define Counters for Loading Samples 
int columnCount=0; 
int rowCount=0; 
int histVal=0; 

// Load Label0 Samples to Training Data 
for(unsigned int i=0;i<globLabel0.gl_pathc;i++){ 
    file.open(globLabel0.gl_pathv[i]); 
    while(file >> histVal){ 
     trainingData[i][columnCount]=(histVal); 
     columnCount++; 
    } 
    file.close(); 
    rowCount=i; 
    columnCount=0; 
} 

Permettez-moi de vous dire pas de code par étape:

1er: J'initialiser mon objet ifstream.

ifstream file; 

2ème: J'enregistré tous mes fichiers texte dans l'objet globLabel0 et globLabel0 est initialisé comme suit:

glob_t globLabel0; 

Puis-je stocker tous les fichiers texte dans le répertoire comme suit:

glob(trainLabel0.c_str(),GLOB_TILDE,NULL,&globLabel0); 

Je sais que globLabel0 a 5923 fichiers texte, j'ai vu pendant le débogage.

Alors j'ai essayé d'ouvrir 1er fichier texte suivi

file.open(globLabel0.gl_pathv[0]); 

3: Après avoir trouvé ColumnSize. J'ai fermé mon objet fichier.

file.close(); 

4: Voici mon problème, lorsque je tente d'ouvrir le fichier dans la boucle for

for(unsigned int i=0;i<globLabel0.gl_pathc;i++){ 
     file.open(globLabel0.gl_pathv[i]); // Problem Here 

Je l'erreur suivante:

enter image description here

Si possible, pourriez-vous S'il vous plaît dites-moi où j'ai fait une erreur?

+0

On dirait que vous n'avez pas autant de membres de 'globLabel0.gl_pathv' que vous pensez avoir. –

+1

Non, ne téléchargez pas le code entier. Télécharger un [mcve]. –

+0

@JonathanMee "vous n'avez pas autant de membres de globLabel0.gl_pathv" Si vous voulez dire si mon objet globLabel0 est vide, j'ai un fichier texte 5923. Ici vous pouvez voir sur le lien: https://www.mediafire.com/?d883fgma1r4xp8x –

Répondre

0

vous utilisez le même flux d'entrée pour ouvrir plusieurs fichiers ce qui provoque que le premier fichier à ouvrir correctement afin que vous puissiez l'intérieur boucle fermée après ouverture d'un fichier puis ouvrez la suivante et ainsi de suite:

// after any read of a file if you want to open another file then clse the file to save and clear its buffer then open the next... 

file.close(); 
file.clear(); 

for(unsigned int i=0;i<globLabel0.gl_pathc;i++){ 
    file.open(globLabel0.gl_pathv[i]); 

    // read data to an array or vector or list... 
    while(file >> histVal){ 
     trainingData[i][columnCount]=(histVal); 
     columnCount++; 

    file.close(); 
    file.clear(); // it is also important 
} 
+0

Merci pour la réponse, mais je ne sais pas pourquoi mais file.clear(); n'est pas disponible. Je veux dire que la méthode clear() n'est pas listée quand je fais ctrl + space. En plus, j'ai essayé file.close() mais j'ai la même erreur de segmentation :( –

+1

A moins d'avoir un compilateur vraiment ancien, ['open()' appellera aussi 'clear()'] (http: //www.open- std.org/jtc1/sc22/wg21/docs/lwg-defects.html#409) –

+1

donc l'alternative est de créer un tableau d'objets 'ifstream' autant que le nombre de fichiers et d'utiliser chacun d'entre eux pour ouvrir les fichiers et voyez si cela résout le problème, si cela fonctionne, essayez de trouver une méthode similaire à 'ifstream :: clear' – Raindrop7