Ошибка при выводе в файл в C ++, который я не могу найти - PullRequest
1 голос
/ 08 марта 2009

Не как в "не могу найти ответ на stackoverflow", а как в "не вижу, что я делаю неправильно", большая разница!

В любом случае код прилагается ниже. То, что он делает, является довольно простым, он берет созданный пользователем текстовый файл и выплевывает тот, который был зашифрован. В этом случае пользователь сообщает, сколько ненужных символов нужно поместить между каждым реальным символом. (IE: если бы я хотел зашифровать слово «Hello» 1 символом мусора, это выглядело бы как «9H (eal ~ l.o») *

Моя проблема в том, что по какой-то причине он неправильно читает входной файл. Я использую ту же настройку для чтения в файле, что и ранее при расшифровке, но на этот раз он читает символы мусора, и когда я говорю, чтобы он выводился в файл, он выводит его на экран, и кажется, что ничего не помещается в выходной файл (хотя он создается, так что это означает, что я сделал что-то правильно, укажите мне!

Код:

string start;
char choice;
char letter;
int x;
int y;
int z;
char c;
string filename;

while(start == "enc")
{
    x = 1;
    y = 1;
    cout << "How many garbage characters would you like between each correct character?: " ;
    cin >> z;
    cout << endl << "Please insert the name of the document you wish to encrypt, make sure you enter the name, and the file type (ie: filename.txt): " ;
    cin >> filename;
    ifstream infile(filename.c_str());
    ofstream outfile("encrypted.txt", ios::out);

    while(!infile.eof())
    {
        infile.get(letter); 
        while ((x - y) != z)         
        {
            outfile << putchar(33 + rand() % 94);
            x++;    
        }
        while((x - y) == z)
        {
            outfile << letter;
            y = 1;
            x = 1;
        }
    }
    outfile.close();
    cout << endl << "Encryption complete...please return to directory of program, a new file named encrypted.txt will be there." << endl;
    infile.close();
    cout << "Do you wish to try again? Please press y then enter if yes (case sensitive).";
    cin >> choice;

То, что я вставил выше начала цикла while, это переменные объявления, это часть гораздо большего кода, который не только будет шифровать, но и расшифровывать, я оставил часть дешифрования, так как она отлично работает, именно это часть, с которой у меня проблема.

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

РЕДАКТИРОВАТЬ :: Я использую Visual C ++ Express 2008, и он отвечает, что нет ни ошибок, ни предупреждений.

ВАЖНОЕ РЕДАКТИРОВАНИЕ Оказывается, это вывод в файл! Однако он выводит числа вместо символов ascii, а также выводит символ мусора для буквы, которая должна быть. Когда он возвращается к «infile.get (letter)», он не получает нового персонажа. Так что сейчас кажется, что проблемы в 2 раза: 1) Печать цифр вместо символов ascii. 2) Использование мусора вместо реального символа, который он должен получать.

Ответ на вопрос Обнаружил вторую часть в «Важном редактировании» ... получается, если вы называете что-то test.txt ... это означает, что оно на самом деле называется test.txt.txt, когда вы вводите его в программу на C ++. Просто хочу показать, что это крошечные, мельчайшие, простые детали, которые приводят к тому, что любая программа становится тупой. Спасибо Джорджу Шору. Ваш комментарий о том, что входной файл находится не в том месте, дал мне идею попробовать настоящее название элемента.

Спасибо всем, кто помог с ответом!

Ответы [ 3 ]

4 голосов
/ 08 марта 2009

В дополнение к предыдущим ответам, я полагаю, это потому, что файл, который вы хотите зашифровать, не найден в исходном коде. Можно ли предположить, что вы запускаете код из IDE? Если это так, то файл, который должен быть зашифрован, должен находиться в том же каталоге, что и источник.

Также:

outfile << putchar(33 + rand() % 94);

кажется источником вашего мусора на экране; функция «putchar» эхом выводится на экран, возвращая целочисленное значение этого символа. Затем произойдет то, что число будет выводиться в файл, а не символ.

Изменение этого блока на что-то вроде:

while ((x - y) != z)         
{
    c = (33 + rand() % 94);
    outfile << c;
    x++;
}

должен разрешить запуск кода так, как вы хотите.

3 голосов
/ 08 марта 2009

Вместо того, чтобы делать это:

while (!infile.eof())
{
    infile.get(letter);
    if (infile.good())
    {

Сделайте это:

while (infile.get(letter))
{

Это стандартный шаблон для чтения файла.
Он получает символ, и полученный инфиль (который возвращается get) затем проверяется, чтобы проверить, хорош ли он, преобразовав его в bool.

Строка:

outfile << putchar(33 + rand() % 94);

Вероятно, должно быть:

outfile << static_cast<char>(33 + rant() % 94);

putchar () печатает на стандартный вывод. Но возвращаемое значение (так же, как и вход) отправляется в выходной файл. Чтобы остановить это, просто преобразуйте значение в char и отправьте в outfile.

0 голосов
/ 08 марта 2009

Необходимо ли использовать 'y'? Это кажется запутанным и ненужным для меня. Если бы я реализовывал это, то я ожидал бы использовать только 'x' и 'z'.

Я также не уверен насчет условия 'while (!infile.eof())'; Паскаль определяет EOF заранее, но C ++ может рассказать вам о EOF только после попытки прочитать символ . Однако это повлияет только на конец файла, а не на основную часть цикла.

    while (!infile.eof())
    {
        infile.get(letter);
        if (infile.good())
        {
            for (int i = 0; i < z; i++)        
                outfile << putchar(33 + rand() % 94);
            outfile << letter;
        }
    }

(Нескомпилированный код!).

Кроме того, не используйте это в целях безопасности - это может немного помочь, но, безусловно, не скроет информацию от решительного.

...