Форум программистов, компьютерный форум CyberForum.ru

fseek не работает - C++

Восстановить пароль Регистрация
 
zepterman
0 / 0 / 0
Регистрация: 08.09.2012
Сообщений: 27
15.03.2013, 22:15     fseek не работает #1
Нужно записать данные в структурированный текстовый файл.
Проблема заключается в том, что в части ввод данных, функция fseek не отрабатывает.
Если в части ввод данных не закрывать файл, а писать сразу все элементы - все нормально, но файл нужно закрывать (такое условие задачи).
Подскажите, в чем проблема, пожалуйста.

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
struct Man
{
    char name[40];
    int age;
};
 
//создание данных
        Man AAA;
    AAA.age=20;
    strcpy(AAA.name, "Jack");
 
    Man BBB;
    BBB.age=30;
    strcpy(BBB.name, "Frank");
 
    Man *CCC;
    CCC = new Man;
    CCC->age=25;
    strcpy(CCC->name, "Jovani");
 
    Man TTT;
 
// ввод данных
    FILE *f=fopen("man.txt", "w");
    fseek(f,1*sizeof(Man),0);
    fwrite(&AAA,sizeof(Man),1,f);
    fclose(f);
 
    f=fopen("man.txt", "w");
    fseek(f,2*sizeof(Man),0);
    fwrite(&BBB,sizeof(Man),1,f);
    fclose(f);
 
    f=fopen("man.txt", "w");
    fseek(f,3*sizeof(Man),0);
    fwrite(CCC,sizeof(Man),1,f);
    fclose(f);
 
//вывод данных
    f = fopen("man.txt", "r");
    long size, count = 0;
    fseek(f, 0, SEEK_END);
    size = ftell(f);
    fseek(f, 0, SEEK_SET);
 
    while (size > count * sizeof(Man))
    {
        fread(&TTT, sizeof(Man), 1, f);
        cout<< "Name: "<< TTT.name<< endl;
        cout<< "Age: "<< TTT.age<< endl;
        count++;
        fseek(f, count * sizeof(Man), SEEK_SET);
    } 
 
    fclose(f);
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.03.2013, 22:15     fseek не работает
Посмотрите здесь:

fseek вылетает C++
работа с fseek и файлами C++
Функция fseek C++
C++ fseek / fread
C++ Работа с файлами (fseek)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
16.03.2013, 02:08     fseek не работает #2
Цитата Сообщение от zepterman Посмотреть сообщение
Подскажите, в чем проблема,
В том, что, при открытии существующего файла для записи, его содержимое стирается. fseek в коде работает нормально.
Байт
 Аватар для Байт
13993 / 8824 / 1231
Регистрация: 24.12.2010
Сообщений: 15,990
16.03.2013, 10:31     fseek не работает #3
zepterman, Открывай файл в режиме "a". А если ты работаешь в Windows, добавляй "b". Для Linux это тоже не повредит, так что для пущей переносимости открывай в режиме "ab"
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
16.03.2013, 11:53     fseek не работает #4
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
//создание данных
    Man AAA;
    AAA.age=20;
    strcpy(AAA.name, "Jack");
 
    Man BBB;
    BBB.age=30;
    strcpy(BBB.name, "Frank");
 
    Man *CCC;
    CCC = new Man;
    CCC->age=25;
    strcpy(CCC->name, "Jovani");
 
    Man TTT;
 
// ввод данных
    FILE *f=fopen("man.txt", "wb");
    fwrite(&AAA,sizeof(Man),1,f);
    fclose(f);
 
    f=fopen("man.txt", "ab");
    //fseek(f,1*sizeof(Man),0);
    fwrite(&BBB,sizeof(Man),1,f);
    fclose(f);
 
    f=fopen("man.txt", "ab");
    //fseek(f,2*sizeof(Man),0);
    fwrite(CCC,sizeof(Man),1,f);
    fclose(f);
 
//вывод данных
    f = fopen("man.txt", "rb");
    long size, count = 0;
    fseek(f, 0, SEEK_END);
    size = ftell(f);
    fseek(f, 0, SEEK_SET);
 
    while (size > count * sizeof(Man))
    {
        fread(&TTT, sizeof(Man), 1, f);
        cout<< "Name: "<< TTT.name<< endl;
        cout<< "Age: "<< TTT.age<< endl;
        count++;
        fseek(f, count * sizeof(Man), SEEK_SET);
    } 
 
    fclose(f);
zepterman
0 / 0 / 0
Регистрация: 08.09.2012
Сообщений: 27
21.03.2013, 21:18  [ТС]     fseek не работает #5
Спасибо!
Yandex
Объявления
21.03.2013, 21:18     fseek не работает
Ответ Создать тему
Опции темы

Текущее время: 04:24. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru