程序几乎运行,文件操作有问题
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
不适合我的 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))
{
}
更好的测试是读取字符、取消加密并与原始输入进行比较。
程序几乎可以运行,但我不确定如何为此制作 .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
不适合我的 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))
{
}
更好的测试是读取字符、取消加密并与原始输入进行比较。