2016-12-10 2 views
0

Voici mon code:C++ sortie: std :: Cout et fichier de sortie ont pas le même contenu

//main.cpp 

#include <iostream> 
#include <fstream> //files 
#include <string> //strings 
#include <sstream> //stringstreams 

string intToString(int wert){ 
    ostringstream strout; 
    string str; 
    strout<<wert; 
    str=strout.str(); 
    return str;} 

int stringToInt(string str){ 
    istringstream strin; 
    unsigned long long intVar; 
    strin.str(str); 
    strin>>intVar; 
    return intVar;} 

string wordsToAscii(string wort){ 
    string hold; 
    for(int j=0;j<wort.length();j+=3){ 
     for(int i=j;i<j+3;i++){ 
      if(int(wort[i]>=100)) 
       hold=hold+intToString(int(wort[i])); 
      if(int(wort[i]>=10 && wort[i]<=99)) 
       hold=hold+"0"+intToString(int(wort[i])); 
      if(int(wort[i]<=9)) 
       hold=hold+"00"+intToString(int(wort[i])); 
     } 
    } 
    return hold; 
} 

string AsciiToWords(string wort){ 
    string hold; 
    string total; 
    for(int j=0;j<wort.length();j+=15) 
     for(int i=j;i<j+15;i+=3){ 
      hold="\0"; 
      for(int k=i;k<i+3;k++) 
       hold+=wort[k]; 
      if(hold=="000") 
       break; 
      total+=stringToInt(hold); 
     } 
    return total; 
} 

int main(){ 

    string str; 

    ifstream f ("input"); 
    ofstream g ("temp"); 
    while(!f.eof()) 
     if(getline(f,str)){ 
      cout<<wordsToAscii(str)<<"\n"; 
      g<<wordsToAscii(str)<<"\n";} 
    f.close(); 
    g.close(); 

    ifstream h ("temp"); 
    ofstream i ("output"); 
    while(!h.eof()) 
     if(getline(h,str)){ 
      cout<<AsciiToWords(str)<<"\n"; 
      i<<AsciiToWords(str)<<"\n";} 
    h.close(); 
    i.close(); 

    return 0; 
} 
entrée

: (fichier)

first line test1 
second line test2 
last line test3 
testA testB testC 
one 
two 

temp: (fichier)

8105110101032116101115116049000000 
8105110101032116101115116050000 
8105110101032116101115116051 
116101115116065032116101115116066032116101115116067000 
111110101 
116119111 

sortie: (fichier)

first line test1 
second line test2 
last line test3 
testA testB testC 
one 

sortie: (dans le terminal)

8105110101032116101115116049000000 
8105110101032116101115116050000 
8105110101032116101115116051 
116101115116065032116101115116066032116101115116067000 
111110101 
116119111 
first line test1 
second line test2 
last line test3 
testA testB testC 
oneA 
twoA 

La première fonction permet de convertir en caractères ASCII leurs numéros correspondants. Le second est censé le reconvertir.

Les deux fonctions semblent fonctionner correctement. Le problème est la sortie différente dans le fichier et le terminal. La seule différence est cout<< au lieu de i<<

De même, avec une entrée différente, parfois la dernière ligne est écrite deux fois, ou pas du tout écrite. Je ne peux pas l'expliquer moi-même. Je l'ai étudié heures, changé le mode de lecture/écriture de fichiers, réécrit certaines parties de code, etc., sans trouver la raison

Merci à l'avance de l'aide

+0

[ 'while (! Eof())' est faux] (http://stackoverflow.com/questions/5605125/why-is-iostreameof-inside-a-loop-condition-considered-wrong) . – melpomene

+0

Attention à votre moût [i]. Dans votre code «je» peut être plus grande que la longueur de moût. – Ripi2

+0

Que sont 'stringToInt' et' intToString'? – melpomene

Répondre

2

J'ai corrigé quelques erreurs et cette version fonctionne pour moi. J'ai essayé de respecter votre façon de le faire, même si c'est un peu étrange

J'ai supprimé les fonctions intToString et stringToInt. Utilisé la fonction statique to_string de la chaîne à la place. J'ai enlevé les doubles boucles dans les wordsToAscii et les fonctions AsciiToWords parce qu'ils sont inutiles et il est plus difficile de voir ce qui se passe

Je pense que le principal problème ici est la façon dont les fichiers sont lus, juste effectuer un certain temps (getline (h, str)) est suffisant pour le lire jusqu'à la fin comme indiqué dans un autre commentaire.

Espérons que cette aide!

string wordsToAscii(string wort){ 
    string hold; 
    int ascii_value; 

    for(int i=0 ; i < wort.length() ; i++){ 
     char car = wort[i]; 
     ascii_value = int(car); 

     if(ascii_value >=100) 
       hold=hold+ to_string(ascii_value); 
     else if(ascii_value >=10 && ascii_value <=99) 
       hold += "0"+ to_string(ascii_value); 
     else 
       hold += "00"+ to_string(ascii_value); 
    } 
    return hold; 
} 

string AsciiToWords(string wort){ 
    string hold; 
    string total; 
    int ascii_value; 
    char car; 

    for(int i=0 ; i<wort.size() ; i+=3){ 
     hold =""; 
     for(int k=i;k<i+3;k++) 
      hold+=wort[k]; 

     ascii_value = atoi(hold.c_str()); // Conversion of the string "105" to value 105 
     car = ascii_value; //Conversion of the value 105 to corresponding ASCII character 'f' 
     total += car;//Concatenate the character 'f' to string 
    } 
    return total; 
} 

int main(){ 

    string str; 

    ifstream f ("C:\\input.txt"); 

    if(!f.is_open()){ 
     cout << "File not opened " << endl; 
     return 0; 
    } 

    ofstream g ("temp"); 
    while(getline(f,str)){ 
     cout << wordsToAscii(str) << "\n"; 
     g<<wordsToAscii(str)<< "\n"; 
    } 
    f.close(); 
    g.close(); 

    ifstream h ("temp"); 
    ofstream i ("output"); 
    while(getline(h,str)){ 
      cout << AsciiToWords(str) << "\n"; 
      i << AsciiToWords(str) << "\n"; 
    } 
    h.close(); 
    i.close(); 

    return 0; 
} 
+0

Cela semble fonctionner. Merci – westernCiv

0

eof() renvoie true seulement après tentative infructueuse de lire la fin du fichier, quand vous utilisez une construction incorrecte alors que (! eof()) votre code fait une itération supplémentaire dans une boucle.

Après cette itération, il y a des erreurs dans les variables que vous avez lues. Cette poubelle est différente lorsque vous imprimez des données à la console et de déposer, c'est pourquoi vous voyez une sortie différente

Il y a aussi quelques problèmes avec les fonctions asciiToWords et wordsToAscii, ici travaille après quelques changements:

//main.cpp 

#include <iostream> 
#include <fstream> //files 
#include <string> //strings 
#include <sstream> //stringstreams 

using namespace std; 

string intToString(int wert){ 
    ostringstream strout; 
    string str; 
    strout<<wert; 
    str=strout.str(); 
    return str;} 

int stringToInt(string str){ 
    istringstream strin; 
    unsigned long long intVar; 
    strin.str(str); 
    strin>>intVar; 
    return intVar;} 

string wordsToAscii(string wort){ 
    string hold; 
    for(int i=0;i<wort.length();i++){ 
      if(int(wort[i]>=100)) 
       hold=hold+intToString(int(wort[i])); 
      if(int(wort[i]>=10 && wort[i]<=99)) 
       hold=hold+"0"+intToString(int(wort[i])); 
      if(int(wort[i]<=9)) 
       hold=hold+"00"+intToString(int(wort[i])); 
    } 
    return hold; 
} 

string AsciiToWords(string wort){ 
    string hold; 
    string total; 
    for(int j=0;j<wort.length();j+=3) 
    { 
     hold=""; 
     for(int i=j;i<j+3;i++) 
      hold+=wort[i]; 
     total+=stringToInt(hold); 
    }  
    return total; 
} 

int main(){ 

    string str; 

    ifstream f ("input"); 
    ofstream g ("temp"); 
    while(getline(f,str)) 
    { 
      cout<<wordsToAscii(str)<<"\n"; 
      g<<wordsToAscii(str)<<"\n"; 
    } 
    f.close(); 
    g.close(); 

    ifstream h ("temp"); 
    ofstream i ("output"); 
    while(getline(h,str)) 
    { 
      cout<<AsciiToWords(str)<<"\n"; 
      i<<AsciiToWords(str)<<"\n"; 
    } 
    h.close(); 
    i.close(); 

    return 0; 
} 
+0

Cela signifie que je devrais utiliser 'while (getline (h, str))'? Il donne la même sortie comme avant.Et la dernière ligne "deux" n'est pas imprimée du tout ... – westernCiv

+0

quoi exactement fonctionne asciiToWords et motsToAscii faire? – Sandro

+0

"La première fonction convertit les caractères dans leurs numéros ASCII correspondants, le second est censé les reconvertir." 'Bonjour = 072-101-108-108-111-000'. Les zéros sont ajoutés pour rendre 'length()% 9 == 0' true – westernCiv