2013-05-21 5 views
0

J'essaie de lire les fichiers .dat en tableau 2D, j'ai essayé de lire avec succès les mêmes fichiers dans des tableaux 1D tels que chaque ligne pour chaque tableau. Cependant, avec le code ci-dessous pour le tableau 2D, une boîte de message apparaît indiquant "Exception non gérée à 0x00B67361 dans ConsoleApplication11.exe: 0xC0000005: violation de l'accès, lecture de l'emplacement 0x00000000". .? Et ne termine pas l'exécution » Quelle est la raison de l'exception non gérée J'utilise VS 2012 Express EditionException non gérée à 0x00B67361

do { 
     char * s = find_data.cFileName; 

     ifstream fin; 
     fin.open(s); // open a file 
     if (!fin.good()) 
      return 1; // exit if file not found 

     // read each line of the file 
     while (!fin.eof()) 
     { 
      // read an entire line into memory 
      char buf[MAX_CHARS_PER_LINE]; 
      int n = 0; 
      int s = 0; 
      int m = 0; 

      // array to store memory addresses of the tokens in buf 
      const char* token[MAX_TOKENS_PER_LINE][MAX_TOKENS_PER_LINE] = {}; // initialize to 0 
      for (m = 1; m < MAX_TOKENS_PER_LINE; m++) 
      { 
       fin.getline(buf, MAX_CHARS_PER_LINE); 

       // parse the line into blank-delimited tokens 
       // a for-loop index 
       //char* next_token[MAX_TOKENS_PER_LINE] = {}; // initialize to 0 
       char *next_token; 
       // parse the line 
       token[0][0] = strtok_s(buf, DELIMITER, &next_token); // first token 
       //token[0] = strtok(buf, DELIMITER); // first token 
       if (token[0][0]) // zero if line is blank 
       { 
        for (n = 1; n < MAX_TOKENS_PER_LINE; n++) 
        { 
         token[m][n] = strtok_s(0, DELIMITER, &next_token); // subsequent tokens 
         //token[n] = strtok(0, DELIMITER); // subsequent tokens 
         if (!token[m][n]) break; // no more tokens 
        } 
       } 
      } 
      // process (print) the tokens 
      for (int i = 0; i < n; i++) // n = #of tokens 
       for (int j = 0; j < m; j++) 
       { 
        cout << "Token[" << i << "," << j << "] = " << token[i][j] << endl; 
        cout << endl; 

       } 
     } 
     // Your code here 
    } while(FindNextFile(h, & find_data)); 
    FindClose(h); 
+0

Ce titre ne va pas être utile à d'autres personnes ayant le même problème. Il est peu probable qu'ils aient une exception à 0x00B67361, et même s'ils l'ont fait, la raison est probablement différente. –

Répondre

6

Q:. 0xC0000005:.? Emplacement de lecture violation d'accès 0x00000000 Quelle est la raison de l'exception non gérée

a: Vous êtes référence un pointeur nULL dans votre code :)

SUGGESTION:.

pas à pas dans le débogueur MSVS retourne Faites bien attention tous les strtok_s de temps() "0" ... et assurez-vous de ne pas tr y pour accéder ultérieurement à ce pointeur nul. Assurez-vous que vous êtes en train de traiter les caractères 8 bits (qui sait: vos paramètres de compilation peuvent vous donner un code Unicode 16 bits). Le plus important: identifiez la ligne exacte à l'origine du plantage et travaillez en arrière à partir des données traitées par cette ligne.

MSVS a un grand débogueur: vous devriez être en mesure de trouver - et corriger - le problème en peu de temps :)

Bonne chance!

+0

J'ai trouvé que le problème commence à partir de la ligne {char * s = find_data.cFileName;}. les débogueurs disent: incapable de lire la mémoire. et j'utilise un jeu de caractères multi-octets. Est-ce que cela a quelque chose à voir avec ça? – Hawk

+0

Oui. Il est dit que find_data == 0. – paulsm4

+0

Je n'arrive toujours pas à trouver pourquoi find_data == 0, j'ai exécuté presque le même code et rien de pareil n'est arrivé. La partie précédente de ce code est {uint64_t a = GetTimeMs64(); \t cout << a << endl; \t POIGNÉE h; \t WIN32_FIND_DATA find_data; \t h = FindFirstFile ("* .dat", & find_data); \t if (h == INVALID_HANDLE_VALUE) { \t \t cout << "erreur" << endl; \t}} pourquoi il n'imprime pas "erreur" si la valeur de la poignée est incorrecte – Hawk