#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);
Комментариев нет:
Отправить комментарий