2010-11-01 51 views
0

J'ai des difficultés à lire les données d'un fichier et à concaténer des parties sélectionnées des données (texte) dans un tampon de mon choix.Problèmes de caractères parasites lors de la lecture du fichier

Le code est comme suit:

char buffer[1000]; 
    char* allNewData = (char *)malloc(10000); 

    while (! myfile.eof()) 
    { 
    myfile.getline (buffer, 1000); 
    pch = strstr (buffer,"bla bla"); 
    if(pch == NULL) 
    { 
    char* temp = buffer; 
    strcat(allNewData, temp); 
    strcat(allNewData, "\n"); 
    } 
    else 
    { 
    strcat(allNewData, "here's bla bla"); 
    strcat(allNewData, "\n"); 
    } 
    } 

    cout<<allNewData<<endl; 

Quand je lance le programme, allNewData premier a un texte d'ordures, suivi par les propres/résultats attendus, comme ceci:

iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii <-rubbish data 
hello <- actual data 

J'ai besoin pour se débarrasser de ces données sur les ordures, comment puis-je changer le code pour y parvenir?

+0

où est le point de question? – Svisstack

+0

Ne sois pas vague, sois un as; écrire un test-cas approprié! http://tinyurl.com/so-hints http://sscce.org/ http://www.xs4all.nl/~weegen/eelis/iso-c++/testcase.xhtml –

+2

N'utilisez pas [! eof()] (http://stackoverflow.com/questions/3771754/what-is-an-fficient-way-of-back-tracking-in-greedy-best-search-algorithm/3773087 # 3773087). –

Répondre

10

Vous devez effacer votre nouveau tampon avant d'utiliser les fonctions de concaténation de chaîne. Ils attendent une chaîne valide, pour pouvoir trouver la fin et donc le début de la concaténation.

Utilisation:

allNewData[0] = '\0'; 

cela fait allNewData dans une chaîne vide. Faites cela avant la boucle, avant de commencer à concaténer toutes les données trouvées.

En outre, votre code doit mieux prendre en charge les différents « gotchas » en matière de E/S et gestion de la mémoire:

  • Ne pas vérifier pour EOF avant de faire un accès en lecture.
  • Vérifiez que la lecture a réussi, avant d'utiliser les résultats de la lecture.
  • Assurez-vous de ne pas dépasser la capacité de votre tampon lors du stockage des données.
+0

se détendre, je pense que votre première option est la bonne (+1 btw), car sinon, il vide le tampon avant chaque ligne d'entrée. OP semble vouloir tout le fichier concaténé. – paxdiablo

+0

@paxdiablo: noté, et déjà supprimé la mention des alternatives. :) Merci. – unwind

0

Encore une fois ... vous devez vérifier que votre opération IO ne manquent pas et eof() doit être utilisé seulement après une opération IO a échoué.

1

Certains commentaires qui pourraient vous être utiles ou le mépris:

  1. s'il y a une ligne plus de 1000 caractères? (et dire que 1001-1008 est 'bla bla')? La ligne sera divisée en deux dans votre nouveau fichier et il y aura une ligne supplémentaire avant "here's blah blah"? Est-ce maintenant un bug ou une fonctionnalité désirée?
  2. Que faire si la ligne est plus longue que 1000, mais "blah" est 996-1000 et le second "blah" est sur le deuxième segment - maintenant vous avez perdu un
  3. Que faire si votre fichier est plus long que 10000 caractères ?

Ils peuvent sembler des questions triviales, mais leur répondre correctement signifie que vous devrez changer votre approche, je suggère l'approche C++ plus pures:

ifstream f_in(<file>); 
    ostringstream s_out; 
    string line; 
    while(f_in.good()) 
    { 
    getline(f_in, line); // global getline function in <string> 
    if (line.find("blah blah") != string::npos) 
    { 
     s_out << "here's blah blah" << endl; 
    } 
    else 
    { 
     s_out << line << endl; 
    } 
    } 

De cette façon, vous n'avez pas s'inquiéter de l'une des questions ci-dessus ...