fwrite():如何编写嵌套结构

时间:2017-05-03 20:34:21

标签: c++ struct fwrite

我在C ++中定义了以下结构

// This is the record
typedef struct {
    unsigned int recid;
    unsigned int num;
    char str[STR_LENGTH];
    bool valid;  // if set, then this record is valid
} rec;

// This is the definition of a block, which contains a number of fixed-sized records
typedef struct {
    unsigned int blockid;
    unsigned int nreserved; // how many reserved entries
    rec entries[MAX_RECORDS_PER_BLOCK]; // array of records
    bool valid;  // if set, then this block is valid
} blk;

数据操作后,我想将其写入文件。 fwrite()是要走的路。我有一个功能:

void WriteValidRecords(FILE *outfile, blk *buffer) {
    for (uint i = 0; i < buffer->nreserved; i++) {
        if (buffer->entries[i].valid) {
            // I think here is the mistake!!
            fwrite(&(buffer->entries[i]), 1, sizeof(rec), outfile);
        }
    }
}

女巫在一个档案中逐一写下记录。这编译但我在文件中得到的是错误的。我认为我在fwrite()作为第一个参数传递的指针是问题所在。但我已经尝试了很多东西,而且我似乎无法找到放在那里的东西。

我不确定这是否重要,但我打电话给WriteValidRecords()

blk *buffer = new blk[nmem_blocks];

temp = fopen(("temp", "wb");

// Do stuff

for (uint i = 0; i < nmem_blocks; i++) {
    WriteValidRecords(temp, &buffer[i], nios);
}

编辑:

temp以二进制形式打开。

我也在linux上,是的..

编辑2:

好的,我尝试在读写模式下打开文件,我认为这应该打印它所读取的内容。它不是。它一次又一次地打印相同的东西。

void WriteValidRecords(FILE *outfile, blk *buffer) {
    for (uint i = 0; i < buffer->nreserved; i++) {
        if (buffer->entries[i].valid) {
            fwrite(&(buffer->entries[i]), 1, sizeof(rec), outfile);
            fseek(outfile, -sizeof(rec), SEEK_CUR);
            rec tmp;
            fread(&tmp, 1, sizeof(rec), outfile);
            cout << tmp.recid << endl;
            cout << tmp.num << endl;
            cout << tmp.str << endl;
        }
    }
}

1 个答案:

答案 0 :(得分:1)

根据您提供给我们的信息并假设您完全按照您的描述使用您的代码,我猜您的问题是fopen()文件处于只写模式。如果您没有关闭文件并以适当的模式重新打开它(即fopen(filename, "rb")fread实际上没有读取任何内容。在上面的代码中,如果您检查返回值fread的{​​{1}},你会发现它为零。

将打开模式更改为"w+b"或以适当的访问模式重新打开文件以重新读取数据。