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

Запись/чтение массива структур в бинарный файл - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 93, средняя оценка - 4.70
Schizorb
 Аватар для Schizorb
508 / 460 / 16
Регистрация: 07.04.2012
Сообщений: 865
Записей в блоге: 1
Завершенные тесты: 1
11.01.2013, 10:50     Запись/чтение массива структур в бинарный файл #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
#include <iostream>
#include <fstream>
 
using namespace std;
 
struct test 
{ 
    int x; 
    int y;  
}; 
 
int main() 
{       
    int size = 5;
  
    test arr[size];
    test tmp; 
 
    for(int i = 0; i < size; ++i)
    {    
        cout << "Enter x: ";
        cin >> arr[i].x; 
        cout << "Enter y: ";
        cin >> arr[i].y;    
        cout << "\n";
    }  
 
    // запись массива в файл
    ofstream fout("data.dat", ios::binary); 
    for(int i = 0; i < size; ++i) 
    {      
        fout.write(reinterpret_cast<char*>(&arr[i]), sizeof(test));
    }
    fout.close();
    
    // чтение из файла одной записи
    ifstream fin("data.dat", ios::binary); 
    fin.seekg(-3 * sizeof(tmp), ios::end);
    fin.read(reinterpret_cast<char*>(&tmp), sizeof(test));
    cout << "x: " << tmp.x << " y: " << tmp.y << "\n";
    
    fin.close();
 
    return 0;
}
Создаю массив структур, записываю в бинарный файл. Некорректно происходит считывание записи с конца файла. То есть при установке позиции таким образом:
C++
1
fin.seekg(-3 * sizeof(tmp), ios::end);
и последующем чтении
C++
1
fin.read(reinterpret_cast<char*>(&tmp), sizeof(test));
в tmp оказывается мусор (вернее вовсе не меняются ее элементы, это видно, если были присвоены какие-то значения ранее). При чтении с начала файла такой проблемы нет:
C++
1
fin.seekg(2 * sizeof(tmp), ios::beg);
Что я делаю не так?
Миниатюры
Запись/чтение массива структур в бинарный файл  
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
MrCold
851 / 749 / 71
Регистрация: 11.01.2012
Сообщений: 1,942
11.01.2013, 11:15     Запись/чтение массива структур в бинарный файл #2
Минус явно лишний

C++
1
fin.seekg(3 * sizeof(tmp), ios::end);
-=ЮрА=-
Заблокирован
Автор FAQ
11.01.2013, 11:31     Запись/чтение массива структур в бинарный файл #3
Цитата Сообщение от Schizorb Посмотреть сообщение
Что я делаю не так?
Цитата Сообщение от Schizorb Посмотреть сообщение
fin.seekg(-3 * sizeof(tmp), ios::end);
- что это за ерунда - указатель в -3 ю позицию там stream pos тобишь unsigned, т.е если надо от конца то вычисляй позицию от начала (такой подход 100 % даёт верные результаты). У тебя было -3 т.е в unsigned INT_MAX - 3 как думаешь в файле из 5-тиструктур такая позиция достижима?
Лови вобщем
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
#include <iostream>
#include <fstream>
using namespace std;
 
struct test 
{ 
    int x; 
    int y;  
}; 
 
int main() 
{       
    int i;
    const int size = 5;
  
    test arr[size];
    test tmp; 
 
    for(i = 0; i < size; ++i)
    {    
        cout << "Enter x: ";
        cin >> arr[i].x; 
        cout << "Enter y: ";
        cin >> arr[i].y;    
        cout << "\n";
    }  
 
    // Г§Г*ГЇГЁГ±Гј Г¬Г*Г±Г±ГЁГўГ* Гў ГґГ*éë
    ofstream fout("data.dat", ios::binary); 
    for(i = 0; i < size; ++i) 
    {      
        fout.write((char *)(&arr[i]), sizeof(test));
    }
    fout.close();
    
    // Г·ГІГҐГ*ГЁГҐ ГЁГ§ ГґГ*éëГ* îäГ*îé Г§Г*ГЇГЁГ±ГЁ
    ifstream fin("data.dat", ios::binary);
    fin.seekg(0, ios::end);
    unsigned long len = fin.tellg();
    fin.seekg(0, ios::beg);
    unsigned long pos = len - 3*sizeof(test);
    fin.seekg(pos, ios::beg);
    fin.read((char *)&tmp, sizeof(test));
    cout << "x: " << tmp.x << " y: " << tmp.y << "\n";
    fin.close();
 
    return 0;
}
Миниатюры
Запись/чтение массива структур в бинарный файл  
-=ЮрА=-
11.01.2013, 11:32
  #4

Не по теме:

Цитата Сообщение от MrCold Посмотреть сообщение
2
fin.seekg(3 * sizeof(tmp), ios::end);
- такой позиции тоже не существует дословно в коде просим передвинуть курсор на 3 позиции правее EOF...

FreeMinder
 Аватар для FreeMinder
36 / 36 / 2
Регистрация: 29.08.2012
Сообщений: 59
11.01.2013, 11:34     Запись/чтение массива структур в бинарный файл #5
Цитата Сообщение от MrCold Посмотреть сообщение
fin.seekg(3 * sizeof(tmp), ios::end);
Вылезет за пределы файла на 3 * sizeof(tmp)
seekg() не умеет отсчитывать с конца, ios::end полезен для определения длины файла
WhiteP
605 / 203 / 23
Регистрация: 20.11.2012
Сообщений: 419
11.01.2013, 12:59     Запись/чтение массива структур в бинарный файл #6
C++
1
fin.seekg(-3 * (signed)sizeof(tmp), ios::end);
Добавлено через 49 минут
Вот так после компиляции выглядит код при знаковом аргументе:

Assembler
1
2
3
4
5
6
7
8
9
10
; 41   :    fin.seekg((signed)0xFFFFFFFFe8, ios::end);
 
    mov esi, esp
    push    2
    push    -1
    push    -24                 ; ffffffe8H
    lea ecx, DWORD PTR _fin$[ebp]
    call    DWORD PTR __imp_?seekg@?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV12@_JH@Z
    cmp esi, esp
    call    __RTC_CheckEsp
А вот так при беззнаковом:

Assembler
1
2
3
4
5
6
7
8
9
10
11
    
; 41   :    fin.seekg(0xFFFFFFFFe8, ios::end);
 
    mov esi, esp
    push    2
    push    255                 ; 000000ffH
    push    -24                 ; ffffffe8H
    lea ecx, DWORD PTR _fin$[ebp]
    call    DWORD PTR __imp_?seekg@?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV12@_JH@Z
    cmp esi, esp
    call    __RTC_CheckEsp
Как видно - перед собственно смещением передается еще один int (т.к. тип параметра seekg имеет размер необходимый для представления максимально возможного смещения в файле в системе (64 бита)), в котором старшие разряды зависят от знака (расширение знакового бита).
Schizorb
 Аватар для Schizorb
508 / 460 / 16
Регистрация: 07.04.2012
Сообщений: 865
Записей в блоге: 1
Завершенные тесты: 1
11.01.2013, 15:01  [ТС]     Запись/чтение массива структур в бинарный файл #7
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
если надо от конца то вычисляй позицию от начала (такой подход 100 % даёт верные результаты)
Согласен, от начала все замечательно работает. Непонятка была именно с отрицательным смещением.

Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
что это за ерунда - указатель в -3 ю позицию там stream pos тобишь unsigned
stream pos разве обязательно беззнаковый? судя по:

C++
1
fin.seekg(-3 * (signed)sizeof(tmp), ios::end);
Работает нормально и с отрицательными значениями. Моя ошибка тут была в том, что при умножении -3 на sizeof(temp) (знакового на беззнаковое) получался беззнаковый результат, а не то, что я хотел бы.

Цитата Сообщение от WhiteP Посмотреть сообщение
перед собственно смещением передается еще один int
Я не смог найти точной информации о типе std::streampos, кроме того, что это синоним fpos<mbstate_t>. А fpos, в свою очередь, зависит от реализации.
http://www.cplusplus.com/reference/ios/streampos/
http://www.cplusplus.com/reference/ios/fpos/

Из вашего примера, правильно ли я понимаю, что streampos на уровне абстракции - это все же тип со знаком, имеющий в реализации две переменные int. И эти переменные принимают разные значения, в зависимости от того, значение какого типа передаем - знакового или беззнакового?

Допустим, если sizeof(int) равно 4, то:

-3 * sizeof(int) = 00000000 fffffff4
-3 * signed(sizeof(int)) = ffffffff fffffff4
WhiteP
605 / 203 / 23
Регистрация: 20.11.2012
Сообщений: 419
11.01.2013, 15:19     Запись/чтение массива структур в бинарный файл #8
Цитата Сообщение от Schizorb Посмотреть сообщение
Я не смог найти точной информации о типе std::streampos, кроме того, что это синоним fpos<mbstate_t>. А fpos, в свою очередь, зависит от реализации.
Возможно. Я компилировал, используя студию 2012. По типу параметра fseekg (что знаковый и что должен давать доступ к файлу максимального размера) нашел инфу в гугле, но сейчас найти не могу...


Цитата Сообщение от Schizorb Посмотреть сообщение
Из вашего примера, правильно ли я понимаю, что streampos на уровне абстракции - это все же тип со знаком, имеющий в реализации две переменные int.
Нет, это скорее signed long long (ну или __int64). На 32-х битной машине передается двумя частями.

Цитата Сообщение от Schizorb Посмотреть сообщение
-3 * sizeof(int) = 00000000 fffffff4
-3 * signed(sizeof(int)) = ffffffff fffffff4
Да, знаковый бит расширяется на старшие разряды этого 64 битного целого.
-=ЮрА=-
Заблокирован
Автор FAQ
11.01.2013, 15:42     Запись/чтение массива структур в бинарный файл #9
Schizorb, должен признать - позиция от конца рабоатет (по крайней мере на MSVS 6.0)
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <fstream>
#include <iostream>
using namespace std;
 
int main()
{
    char chr;
    ifstream ifs("test.txt", ios::binary);
    if(!ifs.is_open())
        cout<<"Error open test.txt"<<endl;
    else
    {
        ifs.seekg(-3, ios::end);
        ifs.read(reinterpret_cast<char*>(&chr), sizeof(char));
        cout<<chr<<endl;
    }
    ifs.close();
    return 0;
}

Касательно твоего кода - мы тут все обсуждаем, но на студийном компиляторе 6.0 он тоже отработал (код поста1 я сразу не тестировал, ориентируясь на скриншот с багом, потому как говориться не прошло и пол года)
Остаётся грешить на компилятор
Миниатюры
Запись/чтение массива структур в бинарный файл  
-=ЮрА=-
Заблокирован
Автор FAQ
11.01.2013, 16:05     Запись/чтение массива структур в бинарный файл #10
Касательно streampos

IOSFWD
template<class _St>
_St fpos<_St>::_Stz;
typedef fpos<mbstate_t> streampos;
typedef streampos wstreampos;
WCHAR.H
#define _WTIME_DEFINED
#endif



typedef int mbstate_t;
typedef wchar_t _Wint_t;

_CRTIMP wint_t __cdecl btowc(int);
Добавлено через 1 минуту

Не по теме:

Сейчас посмотрим что скажет кодпад по поводу отрицательного смещения



Добавлено через 13 минут
Вот что "говорит" компилятор "в стандарте"
Ответ 1 http://codepad.org/c4TBNVJO
Ответ 2 http://codepad.org/AEnQuC2g

В обоих случаях отработка одна и таже
Output:
Enter x: 0
Enter y: 0

Enter x: 1
Enter y: 1

Enter x: 2
Enter y: 2

Enter x: 3
Enter y: 3

Enter x: 4
Enter y: 4

x: 1 y: -1
x: 1 y: -1
А вот что говорит тот же кодпад но на код в котором идёт сброс ошибки после отрицательного сдвига
http://codepad.org/LGAWF5cv
Output:
Enter x: 0
Enter y: 0

Enter x: 1
Enter y: 1

Enter x: 2
Enter y: 2

Enter x: 3
Enter y: 3

Enter x: 4
Enter y: 4

x: 1 y: -1
x: 2 y: 2
Что подтверждает несостоятельность отрицательного сдвига от конца

Добавлено через 2 минуты
Я конечно грешил на intrerpret_cast но как оказалось проблема была именно в сдвиге
http://codepad.org/gGz11EW4
ибо ss.clear() сбрасывая флаги ошибок позволял работать с чистым потокм и как видим чтение в позиции 2 от начала было норм(хотя выше без сброса ошибки - чтение было не успешно)
C++
1
2
3
ss.clear();//
    ss.seekg(2 * sizeof(tmp), ios::beg);
    ss.read(reinterpret_cast<char*>(&tmp), sizeof(test));
-=ЮрА=-
Заблокирован
Автор FAQ
11.01.2013, 16:11     Запись/чтение массива структур в бинарный файл #11
Schizorb, просто проанализируй все те коды, что на пост выше - компилятор в "стандарте" не умеет -3 ios::end ибо там mbstate_t не int, как в MSVS, а unsigned long и вот такая штука происходит :
C++
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
using namespace std;
 
int main()
{
    int spos = -3;
    unsigned int upos = -3;
    cout<<spos<<endl;
    cout<<upos<<endl;
    return 0;
}
Я потому и удивился что -3 в студии отработало. Она то ведь вне стандарта.

Не по теме:

Но в данном случае её нестандартность мне нравится куда больше кодпада

Миниатюры
Запись/чтение массива структур в бинарный файл  
Schizorb
 Аватар для Schizorb
508 / 460 / 16
Регистрация: 07.04.2012
Сообщений: 865
Записей в блоге: 1
Завершенные тесты: 1
11.01.2013, 16:21  [ТС]     Запись/чтение массива структур в бинарный файл #12
-=ЮрА=-, а если так (как предложил WhiteP):
http://codepad.org/iNzRuyWp
Вполне работает с отрицательным смещением.

Добавлено через 1 минуту
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
компилятор в "стандарте" не умеет -3 ios::end ибо там mbstate_t не int, как в MSVS, а unsigned long
У меня gcc, и тоже int:
C++
1
typedef int mbstate_t; // из файла wchar.h
Добавлено через 3 минуты
Может я не о том думаю, но результат будет зависеть от того, какой тип вернуло умножение:

C++
1
2
std::cout << -3 * sizeof(test) << "\n"; // результат - unsigned, слишком большое значение для сдвига
std::cout << -3 * (signed)(sizeof(test)) << "\n"; // результат - signed
А студийный компилятор что по результатов этих умножений говорит? (такое подозрение, что они оба для него signed будут)
WhiteP
605 / 203 / 23
Регистрация: 20.11.2012
Сообщений: 419
11.01.2013, 16:38     Запись/чтение массива структур в бинарный файл #13
1>c:\users\andrew\desktop\consoleapplication4\consoleapplication4\source.cpp(16): warning C4308: negative integral constant converted to unsigned type
1>c:\users\andrew\desktop\consoleapplication4\consoleapplication4\source.cpp(16): warning C4307: '*' : integral constant overflow

Вот что говорит VS2012.
Выводит:
4294967272
-24

В любом случае, если операнд знаковый (или просто старшие биты установлены), то где-то внутри seekg происходит сложение с текущим смещением указателя и получается переполнение, которое равноценно вычитанию. И флаг переполнения не обрабатывается как ошибочная ситуация, вероятно.
То что это не по стандарту - вполне возможно.
-=ЮрА=-
Заблокирован
Автор FAQ
11.01.2013, 17:02     Запись/чтение массива структур в бинарный файл #14
Цитата Сообщение от Schizorb Посмотреть сообщение
А студийный компилятор что по результатов этих умножений говорит? (такое подозрение, что они оба для него signed будут)
- конечно же нет.
Смотри отработку кода
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
#include <iostream>
#include <sstream>
 
using namespace std;
 
struct test 
{ 
    int x; 
    int y;  
}; 
 
int main() 
{       
    int i;
    const int size = 5;
  
    test arr[size];
    test tmp; 
 
    cout<<           sizeof(tmp)<<endl;
    cout<<-3*        sizeof(tmp)<<endl;
    cout<<-3*(signed)sizeof(tmp)<<endl;
 
    for(i = 0; i < size; ++i)
    {    
        cout << "Enter x: "<<(arr[i].x = i)<<endl;
        //cin >> arr[i].x; 
        cout << "Enter y: "<<(arr[i].y = i)<<endl;
        //cin >> arr[i].y;    
        cout << "\n";
    }  
 
    // запись массива в файл
    stringstream ss; 
    for(i = 0; i < size; ++i) 
    {      
        ss.write(reinterpret_cast<char*>(&arr[i]), sizeof(test));
    }
    ss.seekg(0, ios::beg);
    
    // чтение из файла одной записи 
    ss.seekg(-3 * sizeof(tmp), ios::end);
    ss.read(reinterpret_cast<char*>(&tmp), sizeof(test));
    cout << "x: " << tmp.x << " y: " << tmp.y << "\n";
 
    ss.seekg(2 * sizeof(tmp), ios::beg);
    ss.read(reinterpret_cast<char*>(&tmp), sizeof(test));
    cout << "x: " << tmp.x << " y: " << tmp.y << "\n";
    
    ss.clear();
 
    return 0;
}
Миниатюры
Запись/чтение массива структур в бинарный файл  
-=ЮрА=-
Заблокирован
Автор FAQ
11.01.2013, 17:12     Запись/чтение массива структур в бинарный файл #15
Так кодпад съесть не захотел ss.seekg(-3 * sizeof(tmp), ios::end);
http://codepad.org/YekzWQTu

Так тоже ss.seekg(-48, ios::end);
http://codepad.org/I5zN1LP1
А так сжевал
ss.seekg(-3 * (signed)sizeof(tmp), ios::end);
http://codepad.org/PMw7yyY2 съел именно с signed
Schizorb
 Аватар для Schizorb
508 / 460 / 16
Регистрация: 07.04.2012
Сообщений: 865
Записей в блоге: 1
Завершенные тесты: 1
11.01.2013, 17:18  [ТС]     Запись/чтение массива структур в бинарный файл #16
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Так тоже ss.seekg(-48, ios::end);
Почему 48? ss.seekg(-24, ios::end); - это то ест нормально)
http://codepad.org/VCaAwxdO
-=ЮрА=-
Заблокирован
Автор FAQ
11.01.2013, 17:40     Запись/чтение массива структур в бинарный файл #17
Schizorb, в seekg идёт преобразование типа к беззнаковому
http://codepad.org/M9WwMxMo вот смотри что там написано
cc1plus: warnings being treated as errors
Line 44: warning: this decimal constant is unsigned only in ISO C90
а раз unsigned only то юзать -3 некорректно а отработка с -3 и signed скорее баг нежели правильная отработка - лучше двигаться от начала это 100% будет однозначный результат и главное в стандарте.

Добавлено через 11 минут

Не по теме:

Вот однозначный ответ http://codepad.org/BMhFu1eh -24 преобразуется в unsigned и выходит внутрь seekg передаётся 4294967272 что само по себе странно!



Добавлено через 4 минуты
При этом запихнуть туда 4294967272 явным способом невозможно http://codepad.org/LFBwWQ24. Лично я считаю такое положение вещей багом а не достоинством стандарта
Schizorb
 Аватар для Schizorb
508 / 460 / 16
Регистрация: 07.04.2012
Сообщений: 865
Записей в блоге: 1
Завершенные тесты: 1
11.01.2013, 17:42  [ТС]     Запись/чтение массива структур в бинарный файл #18
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
с signed идёт преобразование типа к беззнаковому. Вот смотри что там написано
Хм, предупреждение тут по-моему из-за того, что 4294967272 - слишком большой литерал для типа signed int, а не потому, что типы параметра и аргумента для seekg не совпадают. То есть, вот так, скомпилируется без предупреждения.

C++
1
ss.seekg(4294967272U, ios::end);
Результат, конечно, будет неправильный, в том плане, что отрицательного сдвига никакого не будет (кстати, а студия что скажет на сдвиг 4294967272U ?).

Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
а отработка с -3 и signed скорее баг нежели правильная отработка
С signed-то без проблем работает, и на разных компиляторах. Вот почему на Visual Stusio у вас отработало с -3 * sizeof(test), чей результат unsigned, это видимо особенности студийного компилятора.
-=ЮрА=-
Заблокирован
Автор FAQ
11.01.2013, 17:47     Запись/чтение массива структур в бинарный файл #19
Цитата Сообщение от Schizorb Посмотреть сообщение
это видимо особенности студийного компилятора.
Я писал что студия стоит особняком от стандарта
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Я потому и удивился что -3 в студии отработало. Она то ведь вне стандарта.
Продолжу настаивать на том что следует двигать курсор от начала это будет однозначно и понятно на любом компиляторе.

Добавлено через 1 минуту
Цитата Сообщение от Schizorb Посмотреть сообщение
Результат, конечно, будет неправильный, в том плане, что отрицательного сдвига никакого не будет (кстати, а студия что скажет на сдвиг 4294967272U ?).
- сейчас глянем
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.01.2013, 17:51     Запись/чтение массива структур в бинарный файл
Еще ссылки по теме:

Запись в бинарный файл и чтение из него C++
C++ Запись массива структур в бинарный файл
Std::ofstream запись и чтение переменных в бинарный файл C++

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

Или воспользуйтесь поиском по форуму:
-=ЮрА=-
Заблокирован
Автор FAQ
11.01.2013, 17:51     Запись/чтение массива структур в бинарный файл #20
Вот студийная отработка
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
#include <iostream>
#include <sstream>
 
using namespace std;
 
struct test 
{ 
    int x; 
    int y;  
}; 
 
int main() 
{       
    int i;
    const int size = 5;
  
    test arr[size];
    test tmp; 
 
    cout<<           sizeof(tmp)<<endl;
    cout<<-3*        sizeof(tmp)<<endl;
    cout<<-3*(signed)sizeof(tmp)<<endl;
 
    for(i = 0; i < size; ++i)
    {    
        cout << "Enter x: "<<(arr[i].x = i)<<endl;
        //cin >> arr[i].x; 
        cout << "Enter y: "<<(arr[i].y = i)<<endl;
        //cin >> arr[i].y;    
        cout << "\n";
    }  
 
    // Г§Г*ГЇГЁГ±Гј Г¬Г*Г±Г±ГЁГўГ* Гў ГґГ*éë
    stringstream ss; 
    for(i = 0; i < size; ++i) 
    {      
        ss.write(reinterpret_cast<char*>(&arr[i]), sizeof(test));
    }
    ss.clear();
    ss.seekg(0, ios::beg);
    
    // Г·ГІГҐГ*ГЁГҐ ГЁГ§ ГґГ*éëГ* îäГ*îé Г§Г*ГЇГЁГ±ГЁ 
    unsigned int pos = 4294967272;
    cout<<pos<<endl;
    ss.seekg(/*-3 * sizeof(tmp)*/pos, ios::end);
    ss.read(reinterpret_cast<char*>(&tmp), sizeof(test));
    cout << "x: " << tmp.x << " y: " << tmp.y << "\n";
 
    ss.seekg(/*-3 * sizeof(tmp)*/4294967272, ios::end);
    ss.read(reinterpret_cast<char*>(&tmp), sizeof(test));
    cout << "x: " << tmp.x << " y: " << tmp.y << "\n";
 
    ss.clear();
    ss.seekg(2 * sizeof(tmp), ios::beg);
    ss.read(reinterpret_cast<char*>(&tmp), sizeof(test));
    cout << "x: " << tmp.x << " y: " << tmp.y << "\n";
    
    
 
    return 0;
}
Миниатюры
Запись/чтение массива структур в бинарный файл  
Yandex
Объявления
11.01.2013, 17:51     Запись/чтение массива структур в бинарный файл
Ответ Создать тему
Опции темы

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