Страницы

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

понедельник, 25 февраля 2019 г.

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

Делаю лабу в универе. Есть структуры, данные которых вводятся с клавиатуры, потом записываются в файл с помощью функции 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"< fwrite(&labaDevice, sizeof(device), 1, outFile);
fclose(outFile);
return 0; }


Ответ

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

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

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