程序几乎运行,文件操作麻烦

时间:2015-05-23 03:24:59

标签: c++ visual-c++ operators

该程序几乎运行,但我不知道如何为此制作.txt文件,它没有给我一个错误。

该项目要求我:

"文件加密是在密码中写入文件内容的科学。您的加密程序应该像过滤器一样工作,读取一个文件的内容,进行修改 将数据转换为代码,然后将编码内容写入第二个文件。

第二个文件将是第一个文件的版本,但是用密码编写。虽然有复杂的加密技术,但你应该想出一个简单的加密技术。例如,您可以一次读取一个字符的第一个文件,并在将每个字符写入第二个文件之前将其添加10。 "

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

int main()
{
    char ch;
    fstream fin, fout;
    fin.open("testone.txt", ios::in);
    fout.open("encrypted.txt", ios::out);

    while (!fin.eof())
    {
        fin.get(ch);
        fout.put(ch + 10);
    }

    fin.close();
    fout.close();
    system("pause");
    return 0;
}

2 个答案:

答案 0 :(得分:0)

答案 1 :(得分:0)

不在我的Visual C上,但您可能需要#include <cstdlib>才能获得system

LNK1561意味着无法找到您的主要功能。显然主要功能是存在的,所以这个应该编译。按照Beta的建议,确保您可以编译并运行一个简单的程序。

抛开编译问题,此代码无法正常工作。

首要问题:您没有检查任何错误,因此您的程序无法判断是否出现任何问题。

例如,如果文件没有打开怎么办? while (!fin.eof())变成无限循环。如果文件未打开,则永远无法读取EOF。无论如何,试图使用EOF作为循环条件是一个坏主意。绝对是read the link in @Steephen's comment

如果你没有用fin.get(ch);读一个角色那么什么?当前代码尝试使用该字符。不好的主意。

测试流非常简单。 if (!fin)完成这项工作。阅读流如何工作以了解原因。 Thius简单的测试并没有告诉你出了什么问题,但至少你知道出了什么问题。

为了简化操作,大多数流函数都会返回流。这使您可以将流操作链接在一起,并使if (!fin.get(ch))成为判断get是否有效的简单方法。

所以你的IO循环可以像

一样简单
while (fin.get(ch) && fout.put(ch + 10))
{
}

如果get由于任何原因无法获得ch - 未打开的文件,文件结尾,不可读的文件 - while循环退出。之后,您可以查询fin以找出原因。如果EOF,太棒了。如果不是EOF,输出文件可能是错误的。

同样适用于put。如果put失败,则循环结束。测试原因并决定是否要保留文件。

我还建议在主页末尾放一个快速测试来打印支票。

fin.open("encrypted.txt", ios::in);
while (fin.get(ch) && std::cout.put(ch - 10))
{
}

更好的测试是读取字符,撤消加密,并与原始输入进行比较。