декодер текста с ++ больше, чем просили - PullRequest
0 голосов
/ 14 декабря 2011

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

#include <fstream>
#include <iostream>
#include <string>
using namespace std;

int main() {
  ifstream fin; // input file
  string line;
  ofstream fout;

  //open output file
  fout.open("secret.txt", ios::app);
  if (!fout.good()) throw "I/O error";

  // open input file
  fin.open("secret.txt");
  if (!fin.good()) throw "I/O error";

  // read input file, decode, display to console
  while (fin.good()) {
    getline(fin, line);

    for (int i = 0; i < line.length(); i++) // for each char in the string...
      line[i]--; // bump the ASCII code down by 1

    fout << line << endl; // display on screen
  }

  // close file
  fin.close();

  return 0;
}

текстовый файл из кодировщика читает

Uftujoh234

Ifmmp! Nz! Obnf! Jt! Cpc

Dmptfe!

Uftujoh

, который декодирует в

Testing123

Здравствуйте, меня зовут Боб

Закрыто

Тестирование

Это все дополнительные материалы, которые он также печатает в текстовом файле

Sdrshmf012
Gdkknlxm`ldhrana
Bknrdc
Sdrshmf
Rcqrgle/01
Fcjjmkwl_kcgq`m`
Ajmqcb
Rcqrgle
Qbpqfkd./0
Ebiiljvk^jbfp_l_
@ilpba
Qbpqfkd
Paopejc-./
Dahhkiuj]iaeo^k^
?hkoa`
Paopejc
O`nodib,-.
C`ggjhti\h`dn]j]
>gjn`_
O`nodib
N_mncha+,-
B_ffigsh[g_cm\i\
=fim_^
N_mncha
M^lmbg`*+,
A^eeh

Ответы [ 2 ]

1 голос
/ 14 декабря 2011

Дополнительные вещи не являются дополнительными. Вы записываете данные в тот же файл, который читаете, поэтому вы делаете:

  1. написать строку
  2. читать строку

Вы повторно кодируете данные, которые вы уже закодировали.

1 голос
/ 14 декабря 2011

Дополнительные данные, которые вы видите, являются действительным выводом при декодировании данных в "secret.txt".

Я не уверен, что это именно то, что вам нужно, но знаете ли вы, что вы читаете и пишете в один и тот же файл каждый раз, когда запускаете приложение?

Вы будете добавлять все больше и больше «декодированных» данных в файл, и, следовательно, вы получите дополнительный вывод, на который ссылаетесь.


Также, есть проблема с вашим while -циклом.

fin.good () будет оставаться верным до тех пор, пока некоторые из битов ошибки не будут установлены внутри fin, хотя он будет слишком часто входить в цикл, так как вы должны проверить состояние потока сразу после вызова getline (fin, ...).

В настоящее время чтение не удастся, но вы все равно будете обрабатывать «непрочитанные» данные.


std::getline вернет объект потока, и поскольку std::istream (а также std::ostream) неявно может быть преобразован в логическое значение, чтобы проверить его текущее состояние, вы должны использовать его как условие цикла. *

Измените ваш цикл на что-то, как показано ниже, и посмотрите, решит ли это вашу проблему.

  while (getline (fin, line))
  {
    for (int i = 0; i < line.length(); i++) // for each char in the string...
      line[i]--; // bump the ASCII code down by 1

    fout << line << endl; // display on screen
  }
...