簡體   English   中英

C ++將結構字符串保存到文本文件中

[英]C++ Save a Struct String into A Text File

在我的程序中,我保存了高分以及分鍾和秒的時間。 在我的代碼中,我目前將它作為兩個int存儲在一個名為highscore的結構中。 但是,當我顯示輸出時,這對於格式化來說有點乏味。 我希望將時間顯示為12:02而不是12:2 我有一個變量已經在我的游戲中被稱為字符串時鍾,它已經用冒號格式化,我想要做的就是在我的文本文件中添加它。

如何重構我的代碼以獲得時間戳的單個變量,該變量將被正確格式化? 我希望能夠通過直接調用結構將我的數據寫入文件。

// Used for Highscores
struct highscore
{
    char name[10]; 
    int zombiesKilled; 

    // I would like these to be a single variable        
    int clockMin;
    int clockSec;

    char Date[10];
}; 

// I write the data like this:
highscore data;
// ...
data[playerScore].clockMin = clockData.minutes;
data[playerScore].clockSec = clockData.seconds;

streaming = fopen( "Highscores.dat", "wb" );
fwrite( data, sizeof(data), 1 , streaming); 
// ...

您似乎只想使用C的fwrite()函數將C字符串或std::string寫入文件。

這應該很容易,因為你的C字符串符合ASCII格式(沒有Unicode有趣的業務):

//It appears you want to use C-style file I/O
FILE* file = NULL;
fopen("Highscores.dat", "wb");

//std::string has an internal C-string that you can access
std::string str = "01:00";
fwrite(str.c_str(), sizeof(char), sizeof(str.c_str()), file);
//You can also do this with regular C strings if you know the size.

我們也可以選擇嘗試使用C ++風格的文件I / O來實現更清晰的界面。

#include <iostream>
#include <string>
#include <iomanip>
#include <fstream>

int main() {
    std::string str = "00:11";

    std::ofstream file("example.txt");

    if (file.good()) {
        file << str;
        std::cout << "Wrote line to file example.txt.\n";
    }
    file.close();

    //Let's check if we actually wrote the file.
    std::ifstream read("example.txt");
    std::string buffer;

    if (read.good())
        std::cout << "Opened example.txt.\n";
    while(std::getline(read, buffer)) {
        std::cout << buffer;
    }

    return 0;
}

此外, <chrono>中的數據類型可以證明在那里非常有用。

如果您希望能夠這樣做:

file << data_struct;

那么為std :: ostream創建一個運算符重載是有意義的。

您可以嘗試時間功能。 和讀/寫結構。

然而,正確的方法是使用c ++基本文件存儲而不是轉儲二進制數據。

struct highscore
{
    char name[10];
    int n;
    std::time_t dateTime;
};

int main()
{
    int total_seconds = 61;
    char buf[50];
    sprintf(buf, "minutes:seconds=> %02d:%02d", total_seconds / 60, total_seconds % 60);
    cout << buf << endl;

    std::time_t timeNow = std::time(NULL);
    std::tm timeFormat = *std::localtime(&timeNow);
    cout << "Current date/time " << std::put_time(&timeFormat, "%c %Z") << endl;

    highscore data;

    //write data:
    {
        FILE *streaming = fopen("Highscores.dat", "wb");

        strcpy(data.name, "name1");
        data.n = 1;
        data.dateTime = std::time(NULL);
        fwrite(&data, sizeof(data), 1, streaming);

        strcpy(data.name, "name2");
        data.n = 2;
        data.dateTime = std::time(NULL);
        fwrite(&data, sizeof(data), 1, streaming);

        fclose(streaming);
    }

    //read data:
    {
        FILE *streaming = fopen("Highscores.dat", "rb");

        fread(&data, sizeof(data), 1, streaming);
        cout << "reading:\n";
        cout << data.name << endl;
        cout << data.n << endl;
        timeFormat = *std::localtime(&data.dateTime);
        cout << std::put_time(&timeFormat, "%c %Z") << endl;
        cout << endl;

        fread(&data, sizeof(data), 1, streaming);
        cout << "reading:\n";
        cout << data.name << endl;
        cout << data.n << endl;
        timeFormat = *std::localtime(&data.dateTime);
        cout << std::put_time(&timeFormat, "%c %Z") << endl;
        cout << endl;

        fclose(streaming);
    }

    return 0;
}

暫無
暫無

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

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