簡體   English   中英

將std :: ofstream對象作為參數傳遞給類方法

[英]Passing std::ofstream object as argument to class method

正如前面的問題已得到回答一樣,將std::ofstream對象作為函數參數傳遞的方式似乎是傳遞引用: std::ofstream&

在編譯此解決方案的同時,結果輸出並不等同於在方法內創建std :: ofstream對象,然后調用write()。

以下代碼未提供正確的輸出:

main.cpp中

std::ofstream file(path + "output.stubs");
stub->writeRaw(file); //stub is a pointer to an object of class Stub
file.close();

Stub.cpp中

void Stub::writeRaw(std::ofstream& file) {
    file.write((char*)this, sizeof(*this));
}

通過將Stub.cpp都更改為以下內容,可以提供正確的輸出:

void Stub::writeRaw(void) {
    std::ofstream file(path + "output.stubs");
    file.write((char*)this, sizeof(*this));
    file.close();
}

或將對象寫入main中的文件中,而不是調用類方法。

對此行為的任何幫助將不勝感激!

編輯

類Stub的一些上下文:

Stub.hpp

#pragma once

#include <iostream>
#include <ios>
#include <fstream>

#include "constants.hpp"
#include "DataTypes.hpp"


class Stub {
private:
    StubHeader header;
    StubIntrinsicCoordinates intrinsic;
    StubPayload payload;

public:
    Stub(void);
    virtual ~Stub(void);

    StubHeader getHeader(void);
    StubIntrinsicCoordinates getIntrinsicCoordinates(void);
    StubPayload getPayload(void);

    void setHeader(StubHeader stub_header);
    void setIntrinsicCoordinates(StubIntrinsicCoordinates stub_intrinsic);
    void setPayload(StubPayload stub_payload);

    void print(void);
    void writeRaw(std::ofstream& file);
};

以及相關的數據類型定義如下:

struct StubHeader {
    uint8_t bx;
    uint8_t nonant;
};

struct StubIntrinsicCoordinates {
    uint8_t strip;
    uint8_t column;
    int crossterm;
};

struct StubPayload {
    bool valid;
    int r;
    int z;
    int phi;
    int8_t alpha;
    int8_t bend;
    uint8_t layer;
    bool barrel;
    bool module;
};

編輯2

讀取存根的(玩具)代碼如下:

std::ifstream r(path + "output.stubs");
Stub s;
r.read((char*)&s, sizeof(s));
s.print();

僅一個存根被寫入文件,因為這是對功能的測試。 Stub類的打印功能如下:

void Stub::print(void) {
    std::cout << "----- Header -----" << '\n';
    std::cout << "bx: " << std::dec << (int)header.bx << '\n';
    std::cout << "nonant: " << std::dec << (int)header.nonant << '\n';
    std::cout << "----- Intrinsic Coordinates -----" << '\n';
    std::cout << "strip: " << std::dec << (int)intrinsic.strip << '\n';
    std::cout << "column: " << std::dec << (int)intrinsic.column << '\n';
    std::cout << "crossterm: " << std::dec << (int)intrinsic.crossterm << '\n';
    std::cout << "----- Payload -----" << '\n';
    std::cout << "valid: " << std::boolalpha << payload.valid << '\n';
    std::cout << "r: " << std::dec << (int)payload.r << '\n';
    std::cout << "z: " << std::dec << (int)payload.z << '\n';
    std::cout << "phi: " << std::dec << (int)payload.phi << '\n';
    std::cout << "alpha: " << std::dec << (int)payload.alpha << '\n';
    std::cout << "bend: " << std::dec << (int)payload.bend << '\n';
    std::cout << "layer: " << std::dec << (int)payload.layer << '\n';
    std::cout << "barrel: " << std::boolalpha << payload.barrel << '\n';
    std::cout << "module: " << std::boolalpha << payload.module << "\n\n";
}

編輯3

為了完整性和透明度,請在下面找到main.cpp的確切代碼:

int main(int argc, char const *argv[]) {
    Geometry g;
    g.generateModuleLUTs();
    g.generateCorrectionLUTs();
    std::vector<std::array<Stub*, PAYLOAD_WIDTH> > all_stubs;
    std::vector<Module> modules = g.getData(); 
    for (int i = 0; i < LINK_NUMBER; i++) {
        LinkGenerator link_gen;
        LinkFormatter link_formatter(link_gen.run());
        StubFormatter stub_formatter(link_formatter.run(), i);
        std::array<Stub*, PAYLOAD_WIDTH> stubs = stub_formatter.run(modules);
        CoordinateCorrector coordinate_corrector(stubs);
        all_stubs.push_back(coordinate_corrector.run());
    }
    std::ofstream f(path + "output.stubs");
    all_stubs[0][0]->writeRaw(f);
    all_stubs[0][0]->print();
    std::ifstream r(path + "output.stubs");
    Stub s;
    r.read((char*)&s, sizeof(s));
    s.print();
    return 0;
}

代碼中的錯誤是在構造std::ifstream對象以再次讀取文件之前,我沒有調用file.close() 這是意外行為的原因。

寫一個類文件中使用this似乎是有效的,但你是細心,知道你要寫入文件究竟什么是重要的。

感謝所有發表評論並幫助回答此問題的人!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM