C++ 打开一个文件,修改每个字符,然后执行反向操作';t输出原始文件 #包括 int main() { //压缩 标准::ifstream infle(“test.input”); 标准:流出管(“压缩试验”); 字符c; while(infle>>c) 输出文件>c) outFile2

C++ 打开一个文件,修改每个字符,然后执行反向操作';t输出原始文件 #包括 int main() { //压缩 标准::ifstream infle(“test.input”); 标准:流出管(“压缩试验”); 字符c; while(infle>>c) 输出文件>c) outFile2,c++,file,char,fstream,C++,File,Char,Fstream,这里有两个问题。首先,当您从int中添加(或减去)一个char时,结果是一个int。因此计算c+1将作为数字写入test.compressed(例如,'a'的ASCII码是97。因此在添加1后,您将得到98,它将作为字符'9'和'8'写入文件)。然后从这些字符中减去1,显然不会得到相同的输出。这可以通过将结果向下转换为char来解决 第二个问题更为平淡无奇——在刷新之前,您试图读取已写入的文件,因此可能会丢失部分(或全部)已写入的数据。这可以通过在处理完文件后关闭这些文件来解决,这通常是一种好的

这里有两个问题。首先,当您从
int
中添加(或减去)一个
char
时,结果是一个
int
。因此计算
c+1
将作为数字写入
test.compressed
(例如,
'a'
的ASCII码是
97
。因此在添加
1
后,您将得到
98
,它将作为字符
'9'
'8'
写入文件)。然后从这些字符中减去1,显然不会得到相同的输出。这可以通过将结果向下转换为
char
来解决

第二个问题更为平淡无奇——在刷新之前,您试图读取已写入的文件,因此可能会丢失部分(或全部)已写入的数据。这可以通过在处理完文件后关闭这些文件来解决,这通常是一种好的做法

总而言之:

#include <fstream>

int main()
{
    // compress

    std::ifstream inFile("test.input");
    std::ofstream outFile("test.compressed");
    char c;

    while(inFile >> c)
        outFile << c + 1;

    // decompress

    std::ifstream inFile2("test.compressed");
    std::ofstream outFile2("test.output");

    while(inFile2 >> c)
        outFile2 << c - 1;

    // close

    inFile.close();
    outFile.close();
    inFile2.close();
    outFile2.close();

    return 0;
}
#包括
int main()
{
//压缩
标准::ifstream infle(“test.input”);
标准:流出管(“压缩试验”);
字符c;
while(infle>>c)

outFile如果你要打开一个
ifstream
文件,你已经有了一个
ofstream
句柄,首先刷新它。在开始任何与解压缩相关的操作之前,调用
outFile.flush()
。请注意底层操作系统和文件系统可能会也可能不会将所有数据刷新到你的第一个临时输出文件中“test.compressed”在您打开它进行阅读时。更好的是,不要让对象停留超过需要的时间。将压缩代码括在大括号中(或移动到另一个函数)而且,你可以依靠流析构函数来关闭文件,不需要明确调用“代码”>关闭< /代码>。“反向操作”是什么意思?谢谢!确实,我认为把一个整数打印成文件会被认为是一个字符。原因:如果我打印字符
std::cout,那是因为你也会从空格中减去
1
,而你不会向空格中添加
1
。当你读取文件时,你需要跳过空格。即使没有
@Jeremy,你也可以共享一个示例输入和输出吗?当我用一个简单的in测试它时,上面的代码工作正常put(
abcdefg
)。我用一个.jpeg文件作为输入进行了尝试,但它的工作方式应该是一样的,对吧?它只是字节。有没有可能一个文件考虑字符从-128到127,另一个文件考虑字符从0到255?或者如果一个字符在上限,当我添加+1然后是-1时,它仍然在上限?
#include <fstream>

int main()
{
    // compress

    std::ifstream inFile("test.input");
    std::ofstream outFile("test.compressed");
    char c;

    while(inFile >> c)
        outFile << (char)(c + 1); // Casting to char

    // Close the files you're done with
    inFile.close();
    outFile.close();

    // decompress

    std::ifstream inFile2("test.compressed");
    std::ofstream outFile2("test.output");

    while(inFile2 >> c)
        outFile2 << (char)(c - 1); // You need the cast here too

    // Close the files you're done with
    inFile2.close();
    outFile2.close();

    return 0;
}