1

不像“在stackoverflow上找不到答案”,而是“看不到我做错了什么”,差别很大!

Anywho,代码附在下面。它所做的是相当基本的,它接收一个用户创建的文本文件,并吐出一个已加密的文件。在这种情况下,用户告诉它在每个真实字符之间放置多少垃圾字符。(IE:如果我想用 1 个垃圾字符加密单词“Hello”,它看起来像“9H(eal~lo”)

我的问题是由于某种原因,它没有正确读取输入文件。我使用与之前解密时相同的设置来读取文件,但这次它正在读取垃圾字符,当我告诉它输出到文件时,它会在屏幕上打印出来,看起来像输出文件中没有任何内容(尽管它正在创建中,所以这意味着我已经正确地做了一些事情,请指点我!

代码:

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)”时,它没有得到一个新字符。所以现在看来​​问题有两个:1)打印数字而不是ascii字符。2)使用垃圾而不是它应该得到的实际字符。

已回答的问题 在“重要编辑”中找到了第二部分...如果您将某些东西命名为 test.txt...这意味着当您将其键入 C++ 程序时它实际上称为 test.txt.txt。只是表明是微小的、微小的、简单的细节会导致任何程序出错。感谢乔治·肖尔。您对输入文件位于错误位置的评论使我产生了尝试实际项目名称的想法。

感谢所有帮助解答的人!

4

3 回答 3

4

除了先前的答案,我相信这是因为原始代码找不到您要加密的文件。假设您正在从 IDE 运行代码是否安全?如果是这样,则要加密的文件必须与源文件位于同一目录中。

还:

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

似乎是你的屏幕垃圾的来源;'putchar' 函数在返回该字符的整数值时回显到屏幕。然后会发生的是数字将输出到文件,而不是字符。

将该块更改为:

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

应该使代码能够按照您的意愿运行。

于 2009-03-08T04:26:56.990 回答
3

而不是这样做:

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

做这个:

while (infile.get(letter))
{

这是读取文件的标准模式。
它获取一个字符,然后通过将其转换为 bool 来检查生成的 infile(由 get 返回)以查看它是否仍然有效。

该行:

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

应该是:

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

putchar() 打印到标准输出。但是返回值(与输入相同)进入输出文件。要停止这种情况,只需将值转换为 char 并发送到 outfile。

于 2009-03-08T04:08:58.030 回答
0

y有必要使用' '吗?这对我来说似乎令人困惑和不必要。如果我正在实现这个,那么我希望只使用' x'和' z'。

我也不确定' while (!infile.eof())'条件;Pascal 会提前确定 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;
        }
    }

(未编译的代码!)。

此外,不要将其用于安全性 - 它可能会有所帮助,但它肯定不会向确定的人隐瞒信息。

于 2009-03-08T03:44:19.680 回答