【问题标题】:C++ fstream writes garbage to fileC ++ fstream将垃圾写入文件
【发布时间】:2022-08-18 23:54:22
【问题描述】:

下面的代码创建了一个包含chars 向量的向量。它打开一个fstream 到一个文件。然后从第一个向量写入第一个char。我尝试了编写字符的方法。最后,我尝试打开一个新的 \'fstream\' 并从中打印我写的内容。文件的打印和简单检查都显示它没有任何内容,或者有时是垃圾(取决于writes 的顺序)。没有错误或任何错误的输出出现。我真的为此失去了理智。

#include <iostream>
#include <vector>
#include <fstream>

using namespace std;

int main()
{
    std::vector<char> y(6, 0);
    y[0] = 1;
    std::vector<std::vector<char>> vy;
    vy.push_back(y);
    std::fstream dateir(\"ffff.dat\", std::ios::out | std::ios::out | std::ios::binary);

    dateir<<vy[0][0] << endl;
    int temp = vy[0][0];
    dateir.write((char *)&temp, sizeof(int));
    dateir.close();

      cout << \"here\" << endl;
    std::ifstream dateir2(\"ffff.dat\", std::ios::out | std::ios::out | std::ios::binary);
    
    if (dateir2.is_open())
    {
        std::cout << dateir2.rdbuf();
      }
    else{
        cout << \"no\";
    }
    dateir2.close();
    cout << \"end\";

    return 0;
}
  • 您是否已在调试器中单步执行代码以找出垃圾数据的写入位置?
  • dateir.write((char *)&amp;temp, sizeof(int)); 写入二进制数据,它不会被人类阅读或作为文本打印。向量中的数据也不是可打印的字符。
  • @RetiredNinja 我想写的数据是枯萎的二进制文件。我只是出于调试目的查看该文件(我还使用了txt 后缀)。关于可打印字符 - 我从可以正常工作的代码中获取矢量定义(当我尝试更改写入命令时出现错误)。
  • 听起来不知道如何使用调试器会让您陷入困境。也许是时候学习了?
  • 正如我所说,除了换行符之外,您写入文件的所有数据都是可打印的,因此 std::cout &lt;&lt; dateir2.rdbuf(); 打印 \"garbage\" 是完全可以预期的。如果你用十六进制编辑器查看文件,你会看到。 godbolt.org/z/1fhdnzsxr

标签: c++ file-io fstream


【解决方案1】:

你有......这里有很多问题。

std::fstream dateir("ffff.dat", std::ios::out | std::ios::out | std::ios::binary);

您指定std::ios::out | std::ios::out 是有原因的吗?它是无害的(在这种情况下),但显然是多余的。

作为第一次尝试,我会稍微简化一下代码:

std::ofstream out("ffff.dat", std::ios::binary);
int data = 1;
out.write((char *)&data, sizeof(data));
out.close();

std::ifstream in("ffff.dat", std::ios::binary);
int data2;
in.read((char *)&data2, sizeof(data2));

if (data == data2) {
    // what we read matched what we wrote
} else {
    // what we read didn't match what we wrote
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 2015-06-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多