С++ Сохранить строку из структуры в текстовый файл

В моей программе у меня есть таймер часов, и мне нужно, чтобы он был сохранен в массиве символов [10], который затем был реализован в моей функции рекордов. Через мою программу у меня уже есть форматированное время. Например, если секунды на часах меньше десяти, я должен добавить ноль. Итак, 0:02, и если секунды на часах больше десяти, они остаются в норме. Вместо того, чтобы использовать две переменные типа int в своей структуре, как я могу просто записать строку в свой текстовый файл? Например, давайте напишем строку с именем string clocksTime = "0:15". Обратите внимание, что он уже отформатирован. Вот мой код:

struct highscore
{
    // *Want* Change these two int values to a string
    int clockMin;
    int clockSec;
}; 
...[Code]…
// Change the two variables to have it instead, data[playerScore].clock = clocksTime
data[playerScore].clockMin = clockData.minutes;
data[playerScore].clockSec = clockData.seconds;
_strdate(data[playerScore].Date);

// Write the variables into the text file
streaming = fopen( "Highscores.dat", "wb" );
fwrite( data, sizeof(data), 1 , streaming); 

person ThatCoderBryan    schedule 12.05.2015    source источник
comment
Почему бы просто не сохранить структуру как есть? Если вам нужно снова загрузить файл, было бы неплохо, если бы вы могли загрузить его в ту же структуру? Пусть данные будут данными, а представление будет представлением.   -  person Mads    schedule 12.05.2015
comment
Что не так с fprintf или, если вам действительно нужно это в виде строки, snprintf? Или С++ iostreams/stringstream?   -  person Sebastian    schedule 13.05.2015
comment
Это намного проще с std::string вместо массивов char. Не могли бы вы использовать std::string?   -  person Fabio says Reinstate Monica    schedule 13.05.2015
comment
@FabioTurati, единственная проблема в том, что когда я использую строки, я получаю сообщение об ошибке.   -  person ThatCoderBryan    schedule 13.05.2015


Ответы (1)


Если вы можете использовать std::string, это намного чище. Вот программа, которая это делает:

#include <iostream>

using namespace std;

void int_time_to_string(const int int_time, string& string_time);

int main() {

    int clockMin = 0;
    int clockSec = 15;

    string clockMinString;
    string clockSecString;

    int_time_to_string(clockMin, clockMinString);
    int_time_to_string(clockSec, clockSecString);

    string clockString = clockMinString + ":" + clockSecString;

    cout << "clock = " << clockString << endl;

    return 0;
}

// Convert a time in int to char*, and pad with a 0 if there's only one digit
void int_time_to_string(const int int_time, string& string_time) {

    if (int_time < 10) {
        // Only one digit, pad with a 0
        string_time = "0" + to_string(int_time);
    } else {
        // Two digits, it's already OK
        string_time = to_string(int_time);
    }
}

Если, с другой стороны, вы не можете использовать std::string, вам придется прибегнуть к строкам C, то есть к массивам символов. Я довольно заржавел в этом, но я думаю, что мы можем использовать sprintf для преобразования и strcpy/strcat для работы с некоторыми низкоуровневыми операциями (например, поставить '\ 0' в конце).

#include <iostream>
#include <cstring>

using namespace std;

void int_time_to_string(const int int_time, char* string_time);

int main() {

    int clockMin = 0;
    int clockSec = 15;

    char clockMinString[3] = ""; // 2 digits + null character
    char clockSecString[3] = ""; // 2 digits + null character

    int_time_to_string(clockMin, clockMinString);
    int_time_to_string(clockSec, clockSecString);

    char clockString[6]; // 2 digits, colon, 2 more digits, null character
    strcpy(clockString, clockMinString);
    strcat(clockString, ":");
    strcat(clockString, clockSecString);

    cout << "clock = " << clockString << endl;

    return 0;
}

// Convert a time in int to char*, and pad with a 0 if there's only one digit
void int_time_to_string(const int int_time, char* string_time) {

    if (int_time < 10) {
        // Only one digit, pad with a 0
        strcpy(string_time, "0") ;
        char temp[2]; // 1 digit + null character
        sprintf(temp, "%d", int_time);
        strcat(string_time, temp);
    } else {
        // Two digits, it's already OK
        sprintf(string_time, "%d", int_time);
    }
}

В обоих случаях вам просто нужно взять clockString.

person Fabio says Reinstate Monica    schedule 12.05.2015