输出到C ++中无法找到的文件时出错

时间:2009-03-08 03:29:44

标签: c++ encryption fstream

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

Anywho,代码附在下面。它的作用相当基础,它接收用户创建的文本文件,并吐出一个已加密的文件。在这种情况下,用户告诉它在每个真实角色之间放置多少垃圾字符。 (IE:如果我想用1个垃圾字符加密单词“Hello”,它看起来像“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(字母)”时,它不会获得新字符。所以现在似乎问题是2折: 1)打印数字而不是ascii字符。 2)使用垃圾而不是它应该得到的实际角色。

回答问题 在“重要编辑”中找到第二部分......如果你命名一些test.txt,那就意味着当你在C ++程序中输入它时,它实际上被称为test.txt.txt。只是去表明它是微小的,微小的,简单的细节,导致任何程序变得很糟糕。 谢谢George Shore。您对输入文件位于错误位置的评论使我有了尝试实际项目名称的想法。

感谢所有帮助解决问题的人!

3 个答案:

答案 0 :(得分:4)

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

此外:

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

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

将该块更改为:

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

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

答案 1 :(得分: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()打印到标准输出。但返回值(与输入相同)转到outfile。要停止它,只需将值转换为char并发送到outfile。

答案 2 :(得分:0)

是否需要使用“y”?这对我来说似乎令人困惑和不必要。如果我正在实施此功能,那么我希望只使用“x”和“z”。

我也不确定'while (!infile.eof())'条件; Pascal提前确定EOF,但C ++只能在尝试read a character后告诉你EOF。但是,这只会影响文件的结尾,而不会影响循环的主体。

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

(未编译的代码!)。

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