程序几乎运行,文件操作有问题

Program Almost Runs ,Trouble With File Operation

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

项目要求我:

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

第二个文件将是第一个文件的一个版本,但用密码编写。尽管存在复杂的加密技术,但您应该自己想出一个简单的技术。例如,您可以一次读取第一个文件一个字符,然后将每个字符的 ASCII 码加 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;
}

读这个 -

Error LNK1561: entry point must be defined

https://social.msdn.microsoft.com/Forums/vstudio/en-US/e1200aa9-34c7-487c-a87e-0d0368fb3bff/error-lnk1561-entry-point-must-be-definedproblem-in-c?forum=vclanguage

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

LNK1561 表示找不到您的主函数。显然 main 函数存在,所以这个 应该 编译。遵循 Beta 的建议并确保您可以编译 运行 一个简单的程序。

暂且不考虑编译问题,此代码将无法运行。

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

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

如果你无法读取带有fin.get(ch);的字符,那怎么办?当前代码无论如何都会尝试使用该字符。坏主意。

测试流非常简单。 if (!fin) 完成任务。阅读流的工作原理以了解原因。这个简单的测试不会告诉你哪里出了问题,但至少你知道出了什么问题。

为了让事情变得更简单,大多数流功能 return 流。这使您可以将流操作链接在一起,并使 if (!fin.get(ch)) 成为一种判断 get 是否有效的简单方法。

所以你的IO循环可以像

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

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

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

我还建议在 main 的末尾放置一个快速测试以打印出一张支票。

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

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