IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

 
 Ответить  Открыть новую тему 
> работа с файлами
сообщение
Сообщение #1


Пионер
**

Группа: Пользователи
Сообщений: 104
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


Вот задание:
Каждая строка файла содержит следующие данные: пол, имя, рост. Распечатать средний женский рост и имя самого высокого мужчины по данным файла. Использовать структуру для описания понятия человек.

Написал прогу для заполнения файла:
#include <stdlib.h>
#include <conio.h>
#include <stdio.h>

class qwe
{
public:
char sex;
char name[15];
float height;
qwe();
};

qwe :: qwe()
{
randomize;
if (random(2)==1) sex='m'; else sex='f';
int k;
for(k=0; k<random(10)+5; k++)
name[k]=char(random(25)+65);
name[k]='\0';
height=(random(500)+1500)/10;
}

qwe info[15];

void main()
{
clrscr();
FILE *f;
char ch='\n';
f=fopen("C:\\123.txt","w");
for (int i=0;i<15;i++)
{
fwrite(&info[i].sex,sizeof(info[i].sex),1,f);
fwrite(&info[i].name,sizeof(info[i].name),1,f);
fwrite(&info[i].height,sizeof(info[i].height),1,f);
fwrite(&ch,sizeof(ch),1,f);
}
fclose(f);
getch();
}


Вроде работает...
Теперь пытаюсь считать - ошибку выдает на функции fread. Какие параметры должны быть у этой функции?

#include <stdlib.h>
#include <conio.h>
#include <stdio.h>


class qwe
{
public:
char sex;
char name[15];
float height;
};

void main()
{
clrscr();
qwe human[15];
FILE *f;
f=fopen("C:\\123.txt","w");
fseek(f, SEEK_SET, 0);
for (int i=0;i<15;i++)
{
fread(human[i].sex,sizeof(char),1,f);
fread(human[i].name,sizeof(info[i].name),1,f);
fread(human[i].height,sizeof(float),1,f);
}
fclose(f);
getch();
}


М
Просьба обратить внимание на п.3 правил этого раздела! Lapp



--------------------
go ask Alice
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Пионер
**

Группа: Пользователи
Сообщений: 104
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


Прошу прощения - забыл... а теперь не получается добавить описание... Язык - Си++


--------------------
go ask Alice
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Гость






Unknown, смотри, что происходит: перый параметр fread - указатель на область памяти, КУДА читать данные... Следовательно было бы логично:

  for (int i=0;i<15;i++)
{
fread(&human[i].sex,sizeof(char),1,f);
fread(&human[i].name,sizeof(info[i].name),1,f);
fread(&human[i].height,sizeof(float),1,f);
}
, но это немного не то...

Причин две...

Во-первых, name - это сам по себе указатель, так что брать его адрес - необязательно... Ну, а второе - а что, собственно, произойдет с символами перевода строки? Их тоже надо читать, пусть и в никому не нужную переменную... Ну, и, наконец, открытием
  f=fopen("C:\\123.txt","w");
ты просто удаляешь из файла все содержимое... Я бы делал вот так:

Сохранение
  f=fopen("C:\\123.txt","w");
for (int i=0;i<15;i++)
{
fwrite(&info[i].sex,sizeof(info[i].sex),1,f);
fwrite(info[i].name,15,1,f); // Сохраняешь в любом случае ВСЕ поле, все 15 символов
fwrite(&info[i].height,sizeof(info[i].height),1,f);
fwrite(&ch,sizeof(ch),1,f);
}
fclose(f);


Чтение
  char dummy[2]; // Никому не нужная переменная

f=fopen("C:\\123.txt","r"); // Открывать файл для чтения !!!
fseek(f, SEEK_SET, 0);
for (int i=0;i<15;i++)
{
fread(&human[i].sex,sizeof(char),1,f);
fread(human[i].name,15, 1,f); // Читаешь, соответственно, тоже все 15 символов
fread(&human[i].height,sizeof(float),1,f);
fread(&dummy, sizeof(char), 1, f); // Считываешь перевод строки
}
fclose(f);
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Пионер
**

Группа: Пользователи
Сообщений: 104
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


С открытием файла для чтения - я стормозил... smile.gif
По поводу символа перевода строки - забыл...
Спасибо огромное! Вот, что получилось:
#include <stdlib.h>
#include <conio.h>
#include <stdio.h>

class qwe
{
public:
char sex;
char name[15];
float height;
qwe();
};

qwe :: qwe()
{
randomize;
if (random(2)==1) sex='m'; else sex='f';
int k;
for(k=0; k<random(10)+5; k++)
name[k]=char(random(25)+65);
name[k]='\0';
height=float(random(500)+1500)/10;
}

qwe info[15];

void main()
{
clrscr();
FILE *f;
char ch='\n';
f=fopen("C:\\123.txt","w");
for (int i=0;i<15;i++)
{
fwrite(&info[i].sex,sizeof(char),1,f);
fwrite(&info[i].name,15,1,f);
fwrite(&info[i].height,sizeof(float),1,f);
fwrite(&ch,sizeof(char),1,f);
}
fclose(f);
getch();
}


и

#include <stdlib.h>
#include <conio.h>
#include <stdio.h>
#include <iostream.h>


class qwe
{
public:
char sex;
char name[15];
float height;
};

void main()
{
clrscr();
qwe human;
int n=0;float hm=0,hf=0;char *mname;
FILE *f;
f=fopen("C:\\123.txt","r");
fseek(f, SEEK_SET, 0);
for (int i=0;i<15;i++)
{
fread(&human.sex,sizeof(char),1,f);
fread(&human.name,15, 1,f);
fread(&human.height,sizeof(float),1,f);
if ((human.sex=='m')&(human.height>hm))
{hm=human.height;mname=human.name;}
else {n++;hf+=human.height;}
fread(&human.sex, sizeof(char), 1, f);
}
fclose(f);
cout<<"The highest male is "<<mname<<endl;
cout<<"Common female's height is "<<hf/n<<"sm"<<endl;
getch();
}


--------------------
go ask Alice
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 19.04.2024 9:12
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name