2016-12-10 29 views
0

Вот мой код:C++ Вывод: станд :: соиЬ и выходной файл не имеют одинаковое содержание

//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; 
} 

вход: (файл)

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

температура: (файл)

8105110101032116101115116049000000 
8105110101032116101115116050000 
8105110101032116101115116051 
116101115116065032116101115116066032116101115116067000 
111110101 
116119111 

выпуск: (файл)

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

выход: (в терминале)

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

Первая функция преобразует caracters в их соответствующие номера ASCII. Второй должен преобразовать его обратно.

Эти две функции работают хорошо. Проблема заключается в разном выходе в файле и терминале. Единственная разница - cout<< вместо i<<

Кроме того, с разным входным сигналом, иногда последняя строка записывается дважды или вообще не записывается. Я просто не могу объяснить это сам. Я исследовал часы, изменил способ чтения/записи файлов, переписал некоторые части кода и т.д., не найдя причину,

Заранее спасибо за помощь

+0

[ 'в то время как (! EOF())' неправильно] (http://stackoverflow.com/questions/5605125/why-is-iostreameof-inside-a-loop-condition-considered-wrong) , – melpomene

+0

Остерегайтесь своего сусла [i]. В вашем коде «i» может быть больше длины сусла. – Ripi2

+0

Что такое 'stringToInt' и' intToString'? – melpomene

ответ

2

Я исправил некоторые ошибки, и эта версия работает для меня. Я пытался уважать ваш способ сделать это, даже подумал, что это немного странно

Я удалил функции intToString и stringToInt. Вместо этого использовалась статическая функция to_string из строки. Я удалил двойные петли в словахToAscii и AsciiToWords, потому что они бесполезны и затрудняют просмотр того, что происходит

Я думаю, что основная проблема заключается в том, как читать файлы, просто выполнить некоторое время (getline (h, str)) достаточно, чтобы прочитать его до конца, как указано в другом комментарии.

Надеюсь, что эта помощь!

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

Это похоже работа. благодаря – westernCiv

0

EOF() возвращает истину только после неудачной попытки чтения из конец файла, когда вы используете неправильную конструкцию, пока (! eof()) ваш код выполняет дополнительную итерацию в цикле.

После этой итерации в переменных, которые вы прочитали, есть мусор. Этот мусор отличается при печати данных на консоль и в файл, поэтому вы видите другой вывод

Есть также некоторые проблемы с функциями asciiToWords и wordsToAscii, здесь работают после некоторых изменений:

//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

Это означает, что я должен использовать 'while (getline (h, str))'? Он дает тот же результат, что и раньше.И последняя строка «два» вообще не печатается ... – westernCiv

+0

Что именно функционирует asciiToWords и словаToAscii do? – Sandro

+0

«Первая функция преобразует символы в их соответствующие номера ASCII. Вторая должна конвертировать ее обратно». 'Hello = 072-101-108-108-111-000'. Нули добавляются для того, чтобы make 'length()% 9 == 0' true – westernCiv