打开一个文件,修改每个字符然后执行反向操作不输出原始文件

时间:2017-05-06 10:33:14

标签: c++ file char fstream

#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;
}

这是我的代码。可能有一些我无法理解的东西,因为对我而言,test.input应与test.output相同,但他们并非如此。

1 个答案:

答案 0 :(得分:3)

这里有两个问题。首先,当您从char添加(或减去)int时,结果为int。因此,计算c + 1将被写为test.compressed的数字(例如,'a'的ASCII代码为97。因此,在向1添加98后,您需要获取'9',它将作为字符'8'char)写入文件。然后从这些字符中减去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; } 来解决。

第二个问题更加平淡无奇 - 您在刷新之前尝试从您写入的文件中读取,因此您可能会遗漏您编写的部分(或全部)数据。这可以通过在完成文件后关闭文件来解决,这通常是一种很好的做法。

把它们放在一起:

 public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case R.id.list_users:
            //Toast.makeText(MainActivity.this, "List", Toast.LENGTH_SHORT).show();
            setContentView(R.layout.user_list);
            List("OD12");
            return true;
        case R.id.list_users2:
            setContentView(R.layout.user_list);
            List("OD14");
            return true;
        case R.id.homepage:
            startActivity(new Intent(MainActivity.this,MainActivity.class));
            return true;

        default:
            return super.onOptionsItemSelected(item);
    }
}