Консультация № 189347
11.05.2016, 21:24
0.00 руб.
0 7 0
Здравствуйте!Помогите, пожалуйста, найти ошибку в программе и исправить её.
Задание было следующим: Для хранения данных о ноутбуках описать структуру вида (при необходимости дополнив ее):
struct NOTEBOOK{
char model[21]; // наименование
struct size{ // габаритные размеры
float x;
float y;
float z;
};
float w; // вес
int price; // цена
};
Написать функцию, которая читает данные о ноутбуках из файла note.txt (см.ниже) в структуру приведенного вида. Написать функцию, которая записывает содержимое структуры в конец бинарного файла. Структура бинарного файла: первые два байта (целое) — число записей в файле; далее записи в формате структуры NOTEBOOK.
Написать программу, в которой на основе разработанных функций осуществляется запись в двоичный файл данных только о тех ноутбуках, максимальный объем ОЗУ которых не менее 40 Мбайт, отсортированных по объему.
Все необходимые данные для функций должны передаваться им в качестве параметров. Использование глобальных переменных в функциях не допускается.




Приложение:
#include <stdio.h>
#include <stdlib.h>
#include "struc.h"
#include <windows.h>
#include <string.h>

int main()
{
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
FILE *note;
note = fopen("note.txt", "r");
printf("Открытие файла note.txt\n");
if (note==NULL)
{
printf("Не могу открыть файл");
return 0;
}
else printf("Выполнено\n\n");
fclose(note);
read();


return 0;
}
void noteread()
{
FILE *note;
FILE *fout;

note=fopen("note.txt", "r");
fout=fopen("note.bin", "wb");

printf("\tМодель\t\tЦена\t\tВес\t\tГабариты\t\tРазмер ОЗУ\n");
char s[77];
int i=0,k=0;
while (!feof(note))
{
fqets(s, 77, note);
if (atoi(&s[48])>=40)
{
k++;
}
}
fwrite (&k, 2, 1, fout);
fseek(note, 0L, SEEK_SET);
char str[77];
NOTEBOOK a[16], b[1];
while (!feof(note)){
fgets(s,77,note);
if (atoi(&s[24])<7){
strncpy(a[i].model,s, 18);
a[i].cost = atoi(&s[19]);
a[i].bulk = atof(&s[24]);
a[i].sz.x = atof(&s[28]);
a[i].sz.y = atof(&s[33]);
a[i].sz.z = atof(&s[38]);
a[i].freq = atoi(&s[43]);
a[i].ozu = atoi(&s[47]);
a[i].diagonal = atof(&s[50]);
a[i].video = atoi(&s[55]);
a[i].hg = atoi(&s[57]);
a[i].wd = atoi(&s[62]);
a[i].hz = atoi(&s[67]);
a[i].hdd = atof(&s[70]);
i++;
}}
int t=0;
int iz=0;
while (t==0){
for (i=0;i<k-1;i++){
if(a[i].ozu > a[i+1].ozu){
iz=1;
b[0]=a[i];
a[i]=a[i+1];
a[i+1]=b[0];
}
}
if (iz==0){t=1;}else{iz=0;}}

for (i=0;i<k;i++){
printf ("%d %s\t%d\t%f\n",i+1,a[i].model,a[i].ozu,a[i].bulk);
}
fwrite (&a, sizeof (NOTEBOOK), k, fout);
fclose(note);
fclose(fout);
printf ("\nКоличество записей =%d",k);
printf ("\nnote.txt чтение выполнено\n");
printf ("note.bin запись выполнена\n");
}

}
***********************************
Заголовочный файл
***********************************
#ifndef STRUC_H_INCLUDED
#define STRUC_H_INCLUDED

struct NOTEBOOK{
char model[21];
int cost;
float bulk;
struct SIZE{
float x;
float y;
float z;
};SIZE sz;
int freq;
int ozu;
float diagonal;
int video;

int hg;
int wd;
int hz;
float hdd;
};



void noteread()


#endif // STRUC_H_INCLUDED

Обсуждение

давно
Академик
20764
1861
11.05.2016, 22:10
общий
А что не работает?
Хотя, конечно, читать по позициям без какого-либо контроля ошибок - это самоубийство. Вы бы хотя бы sscanf использовали и проверяли всё ли преобразовалось.
давно
Посетитель
399292
22
12.05.2016, 06:16
общий
Адресаты:
В том то и дело, что я не знаю, в чём ошибка, вот какое сообщение выдает компилятор:



Build: Debug in 6 (compiler: GNU GCC Compiler)---------------

mingw32-gcc.exe -Wall -g -c C:\Users\Валерия\Desktop\ИЗ\6\main.c -o obj\Debug\main.o
In file included from c:\program files (x86)\codeblocks\mingw\bin\../lib/gcc/mingw32/4.7.1/../../../../include/windows.h:47:0,
from C:\Users\Валерия\Desktop\ИЗ\6\main.c:4:
c:\program files (x86)\codeblocks\mingw\bin\../lib/gcc/mingw32/4.7.1/include/stdarg.h: In function 'noteread':
c:\program files (x86)\codeblocks\mingw\bin\../lib/gcc/mingw32/4.7.1/include/stdarg.h:102:24: error: storage class specified for parameter 'va_list'
In file included from c:\program files (x86)\codeblocks\mingw\bin\../lib/gcc/mingw32/4.7.1/../../../../include/windows.h:48:0,
from C:\Users\Валерия\Desktop\ИЗ\6\main.c:4:
c:\program files (x86)\codeblocks\mingw\bin\../lib/gcc/mingw32/4.7.1/../../../../include/windef.h:229:23: error: storage class specified for parameter 'DWORD'
c:\program files (x86)\codeblocks\mingw\bin\../lib/gcc/mingw32/4.7.1/../../../../include/windef.h:230:13: error: storage class specified for parameter 'WINBOOL'
c:\program files (x86)\codeblocks\mingw\bin\../lib/gcc/mingw32/4.7.1/../../../../include/windef.h:230:22: error: storage class specified for parameter 'PWINBOOL'
c:\program files (x86)\codeblocks\mingw\bin\../lib/gcc/mingw32/4.7.1/../../../../include/windef.h:230:32: error: storage class specified for parameter 'LPWINBOOL'
c:\program files (x86)\codeblocks\mingw\bin\../lib/gcc/mingw32/4.7.1/../../../../include/windef.h:234:17: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'BOOL'
c:\program files (x86)\codeblocks\mingw\bin\../lib/gcc/mingw32/4.7.1/../../../../include/windef.h:238:23: error: storage class specified for parameter 'BYTE'
c:\program files (x86)\codeblocks\mingw\bin\../lib/gcc/mingw32/4.7.1/../../../../include/windef.h:240:1: error: unknown type name 'BOOL'
c:\program files (x86)\codeblocks\mingw\bin\../lib/gcc/mingw32/4.7.1/../../../../include/windef.h:240:15: error: storage class specified for parameter 'PBOOL'
c:\program files (x86)\codeblocks\mingw\bin\../lib/gcc/mingw32/4.7.1/../../../../include/windef.h:240:22: error: storage class specified for parameter 'LPBOOL'
c:\program files (x86)\codeblocks\mingw\bin\../lib/gcc/mingw32/4.7.1/../../../../include/windef.h:241:24: error: storage class specified for parameter 'WORD'
c:\program files (x86)\codeblocks\mingw\bin\../lib/gcc/mingw32/4.7.1/../../../../include/windef.h:242:15: error: storage class specified for parameter 'FLOAT'
c:\program files (x86)\codeblocks\mingw\bin\../lib/gcc/mingw32/4.7.1/../../../../include/windef.h:243:15: error: expected '=', ',', ';', 'asm' or '__attribute__' before '*' token
c:\program files (x86)\codeblocks\mingw\bin\../lib/gcc/mingw32/4.7.1/../../../../include/windef.h:244:14: error: expected '=', ',', ';', 'asm' or '__attribute__' before '*' token
c:\program files (x86)\codeblocks\mingw\bin\../lib/gcc/mingw32/4.7.1/../../../../include/windef.h:245:14: error: storage class specified for parameter 'PINT'
c:\program files (x86)\codeblocks\mingw\bin\../lib/gcc/mingw32/4.7.1/../../../../include/windef.h:245:20: error: storage class specified for parameter 'LPINT'
c:\program files (x86)\codeblocks\mingw\bin\../lib/gcc/mingw32/4.7.1/../../../../include/windef.h:246:14: error: expected '=', ',', ';', 'asm' or '__attribute__' before '*' token
c:\program files (x86)\codeblocks\mingw\bin\../lib/gcc/mingw32/4.7.1/../../../../include/windef.h:247:15: error: storage class specified for parameter 'LPLONG'
c:\program files (x86)\codeblocks\mingw\bin\../lib/gcc/mingw32/4.7.1/../../../../include/windef.h:248:15: error: expected '=', ',', ';', 'asm' or '__attribute__' before '*' token
c:\program files (x86)\codeblocks\mingw\bin\../lib/gcc/mingw32/4.7.1/../../../../include/windef.h:249:21: error: storage class specified for parameter 'PCVOID'
c:\program files (x86)\codeblocks\mingw\bin\../lib/gcc/mingw32/4.7.1/../../../../include/windef.h:249:29: error: storage class specified for parameter 'LPCVOID'
c:\program files (x86)\codeblocks\mingw\bin\../lib/gcc/mingw32/4.7.1/../../../../include/windef.h:250:13: error: storage class specified for parameter 'INT'
c:\program files (x86)\codeblocks\mingw\bin\../lib/gcc/mingw32/4.7.1/../../../../include/windef.h:251:22: error: storage class specified for parameter 'UINT'
c:\program files (x86)\codeblocks\mingw\bin\../lib/gcc/mingw32/4.7.1/../../../../include/windef.h:251:28: error: storage class specified for parameter 'PUINT'
c:\program files (x86)\codeblocks\mingw\bin\../lib/gcc/mingw32/4.7.1/../../../../include/windef.h:251:35: error: storage class specified for parameter 'LPUINT'
In file included from c:\program files (x86)\codeblocks\mingw\bin\../lib/gcc/mingw32/4.7.1/../../../../include/windef.h:253:0,
from c:\program files (x86)\codeblocks\mingw\bin\../lib/gcc/mingw32/4.7.1/../../../../include/windows.h:48,
from C:\Users\Валерия\Desktop\ИЗ\6\main.c:4:
c:\program files (x86)\codeblocks\mingw\bin\../lib/gcc/mingw32/4.7.1/../../../../include/winnt.h:77:14: error: storage class specified for parameter 'CHAR'
c:\program files (x86)\codeblocks\mingw\bin\../lib/gcc/mingw32/4.7.1/../../../../include/winnt.h:78:15: error: storage class specified for parameter 'SHORT'
c:\program files (x86)\codeblocks\mingw\bin\../lib/gcc/mingw32/4.7.1/../../../../include/winnt.h:79:14: error: storage class specified for parameter 'LONG'
c:\program files (x86)\codeblocks\mingw\bin\../lib/gcc/mingw32/4.7.1/../../../../include/winnt.h:80:14: error: storage class specified for parameter 'CCHAR'
c:\program files (x86)\codeblocks\mingw\bin\../lib/gcc/mingw32/4.7.1/../../../../include/winnt.h:80:22: error: storage class specified for parameter 'PCCHAR'
c:\program files (x86)\codeblocks\mingw\bin\../lib/gcc/mingw32/4.7.1/../../../../include/winnt.h:81:23: error: storage class specified for parameter 'UCHAR'
c:\program files (x86)\codeblocks\mingw\bin\../lib/gcc/mingw32/4.7.1/../../../../include/winnt.h:81:30: error: storage class specified for parameter 'PUCHAR'
c:\program files (x86)\codeblocks\mingw\bin\../lib/gcc/mingw32/4.7.1/../../../../include/winnt.h:82:24: error: storage class specified for parameter 'USHORT'
c:\program files (x86)\codeblocks\mingw\bin\../lib/gcc/mingw32/4.7.1/../../../../include/winnt.h:82:32: error: storage class specified for parameter 'PUSHORT'
c:\program files (x86)\codeblocks\mingw\bin\../lib/gcc/mingw32/4.7.1/../../../../include/winnt.h:83:23: error: storage class specified for parameter 'ULONG'
c:\program files (x86)\codeblocks\mingw\bin\../lib/gcc/mingw32/4.7.1/../../../../include/winnt.h:83:30: error: storage class specified for parameter 'PULONG'
c:\program files (x86)\codeblocks\mingw\bin\../lib/gcc/mingw32/4.7.1/../../../../include/winnt.h:84:15: error: storage class specified for parameter 'PSZ'
c:\program files (x86)\codeblocks\mingw\bin\../lib/gcc/mingw32/4.7.1/../../../../include/winnt.h:86:15: error: storage class specified for parameter 'PVOID'
c:\program files (x86)\codeblocks\mingw\bin\../lib/gcc/mingw32/4.7.1/../../../../include/winnt.h:86:22: error: storage class specified for parameter 'LPVOID'
c:\program files (x86)\codeblocks\mingw\bin\../lib/gcc/mingw32/4.7.1/../../../../include/winnt.h:92:23: error: storage class specified for parameter 'PVOID64'
c:\program files (x86)\codeblocks\mingw\bin\../lib/gcc/mingw32/4.7.1/../../../../include/winnt.h:105:17: error: storage class specified for parameter 'WCHAR'
c:\program files (x86)\codeblocks\mingw\bin\../lib/gcc/mingw32/4.7.1/../../../../include/winnt.h:106:15: error: expected '=', ',', ';', 'asm' or '__attribute__' before '*' token
c:\program files (x86)\codeblocks\mingw\bin\../lib/gcc/mingw32/4.7.1/../../../../include/winnt.h:107:21: error: expected '=', ',', ';', 'asm' or '__attribute__' before '*' token
c:\program files (x86)\codeblocks\mingw\bin\../lib/gcc/mingw32/4.7.1/../../../../include/winnt.h:108:14: error: expected '=', ',', ';', 'asm' or '__attribute__' before '*' token
c:\program files (x86)\codeblocks\mingw\bin\../lib/gcc/mingw32/4.7.1/../../../../include/winnt.h:109:20: error: expected '=', ',', ';', 'asm' or '__attribute__' before '*' token
c:\program files (x86)\codeblocks\mingw\bin\../lib/gcc/mingw32/4.7.1/../../../../include/winnt.h:120:14: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'TCHAR'
c:\program files (x86)\codeblocks\mingw\bin\../lib/gcc/mingw32/4.7.1/../../../../include/winnt.h:121:14: error: expected '=', ',', ';', 'asm' or '__attribute__' before '_TCHAR'
c:\program files (x86)\codeblocks\mingw\bin\../lib/gcc/mingw32/4.7.1/../../../../include/winnt.h:124:1: error: unknown type name 'TCHAR'
c:\program files (x86)\codeblocks\mingw\bin\../lib/gcc/mingw32/4.7.1/../../../../include/winnt.h:124:15: error: storage class specified for parameter 'TBYTE'
c:\program files (x86)\codeblocks\mingw\bin\../lib/gcc/mingw32/4.7.1/../../../../include/winnt.h:124:22: error: storage class specified for parameter 'PTCH'
Process terminated with status 1 (0 minute(s), 33 second(s))
50 error(s), 0 warning(s) (0 minute(s), 33 second(s))

давно
Академик
20764
1861
12.05.2016, 08:32
общий
Сдаётся мне, что заголовок windows.h - не для gcc, и включать его никак нельзя. Тем более, что вы оттуда ничего не используете.
давно
Посетитель
399292
22
12.05.2016, 15:14
общий
Адресаты:
Дело, как оказалось, было не в этом, сейчас все исправил. Только возникла проблема с записью в бинарный файл, посмотрите, пожалуйста, исправленный код и подскажите, что не так

Код:
#include <stdio.h>
#include <stdlib.h>
#include "struc.h"
#include <string.h>
#include <windows.h>
int main()
{

SetConsoleCP(1251);
SetConsoleOutputCP(1251);
FILE *note;
note = fopen("note.txt", "r");
printf("Открытие файла note.txt\n");
if (note==NULL)
{
printf("Не могу открыть файл");
return 0;
}
else printf("Выполнено\n\n");
fclose(note);
noteread();


return 0;
}
void noteread()
{
FILE *note;
FILE *fout;

note=fopen("note.txt", "r");
fout=fopen("result.txt", "wb");

printf ("n Model\t\t\tCena\tVes\tGabarit\t\t\tOZU\nn");
char s[77]={' '};
int i=0,k=0;
while (!feof(note))
{
fgets(s, 77, note);
if (atoi(&s[48])>=40)
{
k++;
}
}
fwrite (&k, 2, 1, fout);
fseek(note, 0L, SEEK_SET);

NOTEBOOK a[16], b[1];
while (!feof(note)){
fgets(s,77,note);
if (atoi(&s[48])>=40){
strncpy(a[i].model,s, 18);
a[i].cost = atoi(&s[19]);
a[i].bulk = atof(&s[24]);
a[i].sz.x = atof(&s[28]);
a[i].sz.y = atof(&s[34]);
a[i].sz.z = atof(&s[39]);
a[i].freq = atoi(&s[43]);
a[i].ozu = atoi(&s[47]);
a[i].diagonal = atof(&s[50]);
a[i].video = atoi(&s[55]);
a[i].hg = atoi(&s[57]);
a[i].wd = atoi(&s[62]);
a[i].hz = atoi(&s[67]);
a[i].hdd = atof(&s[70]);
i++;
}}
int t=0;
int iz=0;
while (t==0){
for (i=0;i<k-1;i++){
if(a[i].ozu > a[i+1].ozu){
iz=1;
b[0]=a[i];
a[i]=a[i+1];
a[i+1]=b[0];
}
}
if (iz==0){t=1;}else{iz=0;}}

for (i=0;i<k;i++){
printf ("%d %s\t%d\t%.1f\t%3.2fx%3.2fx%3.2f\t\t%d\n",i+1,a[i].model,a[i].cost,a[i].bulk,a[i].sz.x,a[i].sz.y,a[i].sz.z,a[i].ozu);
}
fwrite (&a, sizeof (NOTEBOOK), k, fout); /// записываем в бинарный файл
fclose(note);
fclose(fout);
printf ("\nКоличество записей =%d",k);
printf ("\nЗапись в result.bin выполнена\n");
}
давно
Академик
20764
1861
12.05.2016, 15:56
общий
всё выглядит нормально. &a вместо a хотя и неправильно, но допустимо. вы выводите только два байта от int, который нынче размером 4, но для intel будут выведены как раз младшие байты.
Разве что в структуре есть pad bytes: промежутки между полями, но как раз при выводе её вы используете sizeof()
давно
Посетитель
399292
22
13.05.2016, 19:27
общий
Адресаты:
Скажите, пожалуйста, а как можно проверить, правильно ли записывается структура в бинарный файл?
давно
Посетитель
7438
7205
14.05.2016, 10:51
общий
Адресаты:
Цитата: Yaroslav
Скажите, пожалуйста, а как можно проверить, правильно ли записывается структура в бинарный файл?
Открыть файл любым hex-редактором да посмотреть
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Форма ответа