2016-09-30 1 views
0

Comment est-ce que je signalerais un EOF en lisant dans un fichier en C++? J'écris un scanner codé direct, dans le cadre d'une conception de compilateur, qui lit dans un fichier et le scinde en jetons pour un langage.Comment signaler EOF sur un fichier que le programme ouvre

Je dois lire l'ensemble du programme, supprimer les commentaires et compresser les espaces. Ensuite, placez le programme résultant char par char dans un tampon avec une taille maximale de 1024 caractères. Donc, quand nous vidons, nous allons remplir le tampon ou quoi d'autre.

Pour ouvrir le fichier que j'ai cet écrit:

// Open source file. 
source_file.open (filename); 
if (source_file.fail()) { 
    // Failed to open source file. 
    cerr << "Can't open source file " << *filename << endl; 
    buffer_fatal_error(); 

Pour remplir le tampon, je suis désireux d'utiliser une boucle while et itérer comme

int i = 0; 
// Iterate through the whole file 
while(source_file.at(i) != EOF) 
{ 
    // If not a tab or newline add to buffer 
    if (source_file.at(i) != "\n" || source_file.at(i) != "\t") 
    { 
     bufferList.add(source_file.at(i)); 
    } 
    i++; 
} 

Y aurait-il un moyen de signaler EOF comme ça pour le fichier que j'ouvre?

Ceci est plus ou moins un aperçu général de ce qu'il faut faire. Je devrai trouver comment recharger le tampon une fois vide ou utiliser un double tampon. J'ai aussi besoin de comprendre comment enlever un commentaire qui commencerait par #. Par exemple # This is a comment. Mon scanner verrait # et supprimerait tout ce qui suit jusqu'à ce qu'il obtienne le prochain caractère de nouvelle ligne.

+0

signifie EOF que vous cherchez juste pour une valeur nulle à la fin du fichier –

+0

Essayez d'utiliser 'std :: vector ' pour le tampon et 'istream :: read()' pour lire les données dans la mémoire tampon. –

+0

@ThomasMatthews va 'istream :: read()' enlever les espaces? – GenericUser01

Répondre

0

Essayez ceci:

char c; 
std::vector<char> buffer(1024); 
while (source_file.get(c)) 
{ 
    if ((c != '\n') || (c != '\t')) 
    { 
    buffer.push_back(c); 
    } 
} 

La méthode de référence pour la lecture de données consiste à tester le résultat de l'opération de lecture dans une boucle while.

Pour la lecture de bloc, vous pourriez faire quelque chose comme ceci:

char buffer[1024]; 
while (source_file.read(buffer, sizeof(buffer)) 
{ 
    // Process the buffer here 
} 

Vous devez également utiliser std::istream::gcount() pour obtenir le nombre de caractères lus à partir du fichier, car il pourrait être inférieure à la taille de la mémoire tampon.

+0

Je comprends la partie supérieure de cette réponse. Mais cela fait-il une différence de dire 'source_file.get (c)' par rapport à 'source_file.at (c)', ou sont-ils identiques? Je suppose que je suis juste confus sur ce que 'read' fait et comment l'utiliser pour enlever les commentaires et compresser les espaces. – GenericUser01

+0

Désolé, mais je ne vois pas la méthode 'at()' pour ['std :: istream'] (http://en.cppreference.com/w/cpp/io/basic_istream). –