Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
onex
1

Запись структуры в файл

09.04.2012, 22:57. Показов 1609. Ответов 3
Метки нет (Все метки)

есть структура
C
1
2
3
4
5
6
struct base
{
 int id;
 char name[10];
};
typedef struct base office;
функция для записи в файл
C
1
2
3
4
5
void writes(FILE* file,office of)
 {
 fwrite(&of.id, sizeof(int), 1, file);
 fwrite(&of.name, sizeof(char)*10, 1, file);
}
функция чтения из файла
C
1
2
3
4
5
 void reads(FILE* file,office* of)
 {
  fread(&(of->id), sizeof(int), 1, file);
  fread(&(of->name), sizeof(char)*10, 1, file);
}
функция записывает в файл рандомную информацию

C
1
2
3
4
5
6
7
8
9
10
11
12
void gen(char* file)
{
office off;
FILE* fl = fopen(file,"wb");
char rb[3][10] = {"qqq","www","eee"};
for(int i = 0;i<10;i++)
 {
  off.id = random()%100;
  strcpy(off.name,rb[random()%3]);
  writes(fl,off);
 }
fclose(file);
функция печатает структуру
C
1
2
3
4
void pOff(office of)
{
 printf("%d %s\n",of.i,of.name);
}
чтение из файла
C
1
2
3
4
5
6
7
FILE* f = fopen("data.sq","rb");
office of2;
for(int i=0;i<10;i++)
{
 reads(f,&of2);
 pOff(of2);
}

проблема такая, если запущу генерацию файла даже несколько раз, то поле name не поменяется, уверен что ошибка изза работы с памятью, помогите найти
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.04.2012, 22:57
Ответы с готовыми решениями:

Запись структуры в файл
Как правильно будет записать структуру данных в файл, что бы затем без проблем его можно было...

Запись структуры в файл
Дан файл (testNEW.txt), в котором записана информация о ноутбуках. Часть этой информации нужно...

Запись структуры в файл
Что я не так делаю ?Облазил много тем и так и не понял почему оно не работает. int main(){ int...

Запись структуры в файл
Здравствуйте! Исходный код записи структуры в файл: #include &lt;stdio.h&gt; typedef __int8 ...

3
3081 / 2402 / 255
Регистрация: 11.03.2009
Сообщений: 5,444
10.04.2012, 00:18 2
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

Цитата Сообщение от onex Посмотреть сообщение
C
1
2
3
4
5
void writes(FILE* file,office of)
{
   fwrite(&of.id, sizeof(int), 1, file);
   fwrite(&of.name, sizeof(char)*10, 1, file);
}
C
1
2
3
4
void writes(FILE* file,office of)
{
   fwrite(&of, sizeof(office), 1, file);
}


Цитата Сообщение от onex Посмотреть сообщение
проблема такая, если запущу генерацию файла даже несколько раз, то поле name не поменяется, уверен что ошибка изза работы с памятью, помогите найти
Как таковой работы с памятью здесь нет. Но есть другие нюансы. Во-первых при режиме открытия файла "wb", если файл уже существует, то он будет перезаписан. Во-вторых функция random имеет следующий прототип
C
1
int random (int num)
она возвращает случайное число от 0 до num-1.
В-третьих, чтобы функция random отличалась разнообразием, следует вызвать функцию randomize().
0
onex
10.04.2012, 01:17 3
Цитата Сообщение от kazak Посмотреть сообщение
В-третьих, чтобы функция random отличалась разнообразием, следует вызвать функцию randomize().
ну функция random() как я написал,нормально работает на unix системах,проблема в другом, при повторном вызове функции gen файл перезаписывается id меняет числа, а вот поле name остается прежнее,причем значения разные, они не меняются с новой генерацией
Эксперт С++
5820 / 3472 / 357
Регистрация: 08.02.2010
Сообщений: 7,448
10.04.2012, 03:09 4
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

onex, во-первых, как работать с функцией random, описано на странице man 3 random. Одинаковые значения получаются потому, что при каждом запуске программы значение зерна последовательности псевдослучайных чисел одно и то же, поэтому числа генерируются одинаковые во всех запусках. Поэтому непосредственно перед генерацией псевдослучайных чисел нужно проинициализировать зерно генератора каким-нибудь значением (обычно используют значение time) с помощью функции srandom (или связки initstate/setstate):

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
 
int main(void)
{
    size_t i;
 
    srandom((unsigned) time(NULL));
    
    for(i = 0; i < 5; ++i)
    printf("%d\n", random() % 15);
    
    exit(0);
}
Во-вторых, функция random — нестандартная, так что лучше использовать функцию rand (вместе с функцией инициализации зерна srand) из stdlib.h, если нет веских причин делать иначе.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.04.2012, 03:09

Запись из структуры в файл и обратно
Всем привет! Никак не могу нормально считать и записать з файла в структуру и обратно. Коды...

Неправильная запись структуры в файл
Добрый вечер. Передаю данные из структуры в файл, но вместо того, что записываю я, в файле...

Запись структуры папок в файл
С помощью system(&quot;tree /f&quot;) можно вывести на экран структуру папок того места где находится...

Запись структуры в бинарный файл
если вам покажутся мои вопросы глупыми, не удивляйтесь, решил сам с нуля изучать си, есть книжки...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.