Страницы

Поиск по вопросам

вторник, 24 декабря 2019 г.

C++ при записи структуры в файл с помощью fwrite в файле отображаются крякозябры

#cpp


Делаю лабу в универе. Есть структуры, данные которых вводятся с клавиатуры, потом
записываются в файл с помощью функции fwrite(). До сих пор работал только с fstream,
и проблем не возникало. Тут тоже вроде как всё сделал правильно, но на выхлопе получаю
файл device.txt, а в нём сплошные крякозябры. Собираю с под линукса g++. 
Вся программа на гите https://github.com/rotenbergwitalik/laba6.git

код с main:

#include 
#include 

#define DEVICE_NAME_LEN     30
#define MEASUREVALUE_NAME_LEN     30

using namespace std;

struct powerSource {
    float voltage;
    float amperage;
    float periodicity;
};

struct measuredValue {
    char measuredValueName[MEASUREVALUE_NAME_LEN];
    float lowBorder;
    float highBorder;
    float inaccuracy;
};

struct device {
    char deviceName[DEVICE_NAME_LEN];//
    float devicePrice;
    int guarantee; //in month
    struct powerSource devicePowerSource;
    struct measuredValue deviceMeasureValue;
};
int main() {
    struct device labaDevice;

    cout<<"Write name of device: ";
    cin>>labaDevice.deviceName;
    cout<<"Write price of device in $: ";
    cin>>labaDevice.devicePrice;
    cout<<"Write guarantee in month: ";
    cin>>labaDevice.guarantee;

    cout<<"Write power source for device: "<>labaDevice.devicePowerSource.voltage;
    cout<<"\tAmperage: ";
    cin>>labaDevice.devicePowerSource.amperage;
    cout<<"\tPeriodicity: ";
    cin>>labaDevice.devicePowerSource.periodicity;

    cout<<"Write measure value for device: "<>labaDevice.deviceMeasureValue.measuredValueName;
    cout<<"\tLow border: ";
    cin>>labaDevice.deviceMeasureValue.lowBorder;
    cout<<"\tHigh border: ";
    cin>>labaDevice.deviceMeasureValue.highBorder;
    cout<<"\tInaccuracy: ";
    cin>>labaDevice.deviceMeasureValue.inaccuracy;

    FILE* outFile;
    if ((outFile = fopen("device.txt", "wb")) == NULL) {
        cout<<"Con not open the file"<


Ответы

Ответ 1



Думаю, что вы просто раньше выводили поля с помощью оператора вывода в поток <<, т.е. в текстовом виде. fwrite пишет данные в бинарном виде, как есть. Режим wt меняет одно - обработку \n. Если вы хотите получать все данные в текстовом виде, используйте fprintf - типа, вместо outStream << "guarantee = " << labaDevice.guarantee << endl; используйте fprintf(outFile,"guarantee = %d\n",labaDevice.guarantee); Но учтите, что если потом надо будет считывать - то считывать тоже надо будет текстово. А если используете fwrite в бинарном режиме - то потом всю структуру сразу втянете одним fread в том же бинарном режиме...

Ответ 2



"Кракозябры" зависят от того просмотрщика, которым ты этот файл смотришь. Большинство из них пытаются определить кодировку автоматом. Но т. к. файл записывается не текстовый а бинарный, то вполне возможны ошибки. Если под linux, то из консоли можно посмотреть тем же mc F3. После открытия Alt+E и выбираешь ту, которая у тебя стоит - utf-8, например. Да, и лучше переключится в HEX - режим, чтобы просмотрщик не пытался интерпретировать значения из float или int как текст. :) Кстати, имей в виду, что если кодировка у тебя utf-8 и ты используешь не ascii символы, например русские, то длинна строки в байтах может увеличится раза в 3. Так что при вводе имени из 10-15 символов можешь затереть остальные поля структуры мусором или схватить переполнение стека. :)

Ответ 3



Следует исправить строчку (открытие файла в бинарном режиме) if ((outFile = fopen("device.txt", "wb")) == NULL) { на строчку: if ((outFile = fopen("device.txt", "wt")) == NULL) { После этого надо вручную выводить все поля структуры примерно вот так: fwrite("labaDevice.deviceName = ", sizeof("labaDevice.deviceName = "), 1, outFile); fwrite(labaDevice.deviceName, sizeof(labaDevice.deviceName), 1, outFile);

Комментариев нет:

Отправить комментарий