Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
techya
1 / 1 / 0
Регистрация: 26.11.2012
Сообщений: 19
1

Запись и чтение структуры из файла

23.02.2013, 20:22. Просмотров 956. Ответов 1
Метки нет (Все метки)

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

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#include <stdlib.h>
#include <io.h>
#include <stdio.h>
#include <fcntl.h>
#include <locale.h>
 
#define NUM 1
#define DL 30
 
struct Profile
{
    char FIO[DL];
    int number;
    char name[DL];
    int course;
    char marks[DL];
    float rate;
};
 
struct ProfileInFile
{
    char FIO[DL];
    int number;
    char name[DL];
    int course;
    char marks[DL];
    float rate;
};
 
void ent(Profile *x)
{
    float a;
    int i;
    printf("\n ***ВВОД ДАННЫХ*** \n");
    printf("\n Введите Ваше ФИО: "); fflush(stdin);
    gets(x->FIO);
    printf(" Введите Ваш номер: "); fflush(stdin);
    scanf("%d",&x->number);
    printf (" Введите название Вашей группы: "); fflush(stdin);
    gets(x->name);
    printf(" Введите Ваш курс: "); fflush(stdin);
    scanf("%d",&x->course);
    printf(" Введите Ваши оценки: "); fflush(stdin);
    gets(x->marks);
    printf (" Введите Ваш рейтинг: "); fflush(stdin);
    scanf ("%f", &x->rate);
}
 
 
int main()
{
    setlocale (LC_ALL, "Russian");
    Profile pers[NUM];
    FILE *test;
    int i;
    char filename[]="c:\\ank.txt";
    // Открытие файлов для записи ("w"):
    if ((test = fopen(filename, "w")) == NULL)
    {
        printf("ОШИБКА! Невозможно открыть файл.\n");
        return 1;
    }
    for (i = 0; i < NUM; i++)
        ent(&pers[i]);
    for (i = 0; i < NUM; i++)
    {
        //size_t fwrite(const void *ptr, size_t size, size_t n, FILE*stream);
        fwrite ((void*)&pers[i], sizeof(Profile), 1, test); //Из массива pers[i]
    }
    fclose(test);
    i = 0;
    test = fopen(filename, "r+");
    ProfileInFile p[NUM];
    printf ("\n\n ***РЕЗУЛЬТАТ ЧТЕНИЯ ИЗ ФАЙЛА***");
    while (fscanf (test, "%s%d%s%d%s%f", p[i].FIO, p[i].number, p[i].name, p[i].course, p[i].marks, p[i].rate) != EOF)
    {
        printf ("%s %d %s %d %s %f \n", p[i].FIO, p[i].number, p[i].name, p[i].course, p[i].marks, p[i].rate);
        i++;
    }
    return 0;
}
Если же добавить между 71 и 72 строчкой такой код
C
1
2
3
4
5
6
7
8
9
10
11
12
int boyhandle;
    if ((boyhandle = _open(filename, O_RDONLY)) == -1)
    {
        printf("ОШИБКА! Файл открыт только для чтения!\n");
        return 1;
    }
    lseek(boyhandle, 0L, SEEK_SET);
    for (i = 0; i < NUM; i++)
    {
        _read(boyhandle,(void*)&pers[i], sizeof(ProfileInFile));
    };
    close(boyhandle);
то считывается правильно, но в файл пишется так же само, и программа выдает ошибку после выдачи результатов, хотя результаты, повторюсь, верные.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.02.2013, 20:22
Ответы с готовыми решениями:

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

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

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

Чтение структуры из файла
Добрый вечер! Курсач горит - все готово, но при чтении структуры из файла - fread выдает ноль Уже...

Чтение структуры из файла
(программа на С) В общем, задача написать программу, которая из файла вида: будет заносить...

1
anmartex
...
1717 / 1209 / 909
Регистрация: 12.02.2013
Сообщений: 1,981
24.02.2013, 17:54 2
1. Зачем две дублирующие структуры Profile и ProfileInFile?
2. Если вы работаете с текстовым файлом, то функции fread и fwrite не используются.
3. При использовании функции fscanf ей передают указатели, соответственно для чисел нужно выполнить разадресацию (4, 6 и 8 параметры).

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
#include <stdlib.h>
#include <io.h>
#include <stdio.h>
#include <fcntl.h>
#include <locale.h>
 
#define NUM 1
#define DL 30
 
struct Profile
{
   char FIO[DL];
   int number;
   char name[DL];
   int course;
   char marks[DL];
   float rate;
};
 
void ent(struct Profile* x)
{
   printf("\n ***ВВОД ДАННЫХ*** \n");
   printf("\n Введите Ваше ФИО: ");
   fflush(stdin);
   gets(x->FIO);
   printf(" Введите Ваш номер: ");
   fflush(stdin);
   scanf("%d", &x->number);
   printf(" Введите название Вашей группы: ");
   fflush(stdin);
   gets(x->name);
   printf(" Введите Ваш курс: ");
   fflush(stdin);
   scanf("%d", &x->course);
   printf(" Введите Ваши оценки: ");
   fflush(stdin);
   gets(x->marks);
   printf(" Введите Ваш рейтинг: ");
   fflush(stdin);
   scanf("%f", &x->rate);
}
 
 
int main()
{
   setlocale(LC_ALL, "Russian");
   struct Profile pers[NUM];
   FILE* test;
   int i;
   char filename[] = "ank.txt";
   // Открытие файлов для записи ("w"):
   if ((test = fopen(filename, "w")) == NULL)
   {
      printf("ОШИБКА! Невозможно открыть файл.\n");
      return 1;
   }
   for (i = 0; i < NUM; i++)
   {
      ent(&pers[i]);
   }
   for (i = 0; i < NUM; i++)
   {
      fprintf(test, "%s %d %s %d %s %f\n",
              pers[i].FIO, pers[i].number, pers[i].name,
              pers[i].course, pers[i].marks, pers[i].rate);
   }
   fclose(test);
 
   i = 0;
   test = fopen(filename, "r+");
   struct Profile p[NUM];
   printf("\n ***РЕЗУЛЬТАТ ЧТЕНИЯ ИЗ ФАЙЛА***\n");
   while (fscanf(test, "%s%d%s%d%s%f", p[i].FIO, &p[i].number, p[i].name, &p[i].course, p[i].marks, &p[i].rate) != EOF)
   {
      printf("%s %d %s %d %s %f\n", p[i].FIO, p[i].number, p[i].name, p[i].course, p[i].marks, p[i].rate);
      i++;
   }
   return 0;
}
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.02.2013, 17:54

Чтение структуры из файла и вывод на дисплей
Задание: Записать структуру(информация о студенте:имя курс год рост) в файл. Добавить сведения...

Чтение структуры из файла и вывод на экран
Подскажите, пожалуйста, как считать подобную структуру из файла? 1. Вопрос, состоящий из...

Запись/чтение из файла
#include &lt;stdio.h&gt; main() { char product_name; int product_mass; ...


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

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

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