Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.12.2012, 16:40   #1
rommster
Пользователь
 
Регистрация: 05.10.2010
Сообщений: 46
По умолчанию Бинарный файл. Чтение записи с конца.

День добрый. В бинарный файл записано несколько структур, нужно считать, скажем третью с конца. Как сделать позиционирование.

Если с начала то получается:
Код:
inf.seekg(3 * sizeof(temp), ios::beg);
А так, например не считывает:
Код:
inf.seekg(-3 * sizeof(temp), ios::end);

Последний раз редактировалось rommster; 12.12.2012 в 16:51.
rommster вне форума Ответить с цитированием
Старый 12.12.2012, 16:48   #2
Perchik71
С++, Delphi
Форумчанин
 
Аватар для Perchik71
 
Регистрация: 24.11.2012
Сообщений: 495
Вопрос

Собственно в чём проблема... ты всё и так написал.... методы ifstream inf;
в нём передвигаешься правильно.
Если помог, тут весы есть , Вам не сложно, а мне приятно.
Perchik71 вне форума Ответить с цитированием
Старый 12.12.2012, 16:51   #3
rommster
Пользователь
 
Регистрация: 05.10.2010
Сообщений: 46
По умолчанию

А, ну я там не дописал) Второй пример, который читает с конца, не работает. Белиберду выводит.
rommster вне форума Ответить с цитированием
Старый 12.12.2012, 17:03   #4
rommster
Пользователь
 
Регистрация: 05.10.2010
Сообщений: 46
По умолчанию

Код:
#include <iostream>
#include <cstdlib>
#include <vector>
#include <fstream>
#include <cstring>

using namespace std;

struct STUDENT 
{ 
    int nomer; 
    char name[30];  
}; 
 
int main() 
{      
    int i, j; 
    int size = 5;
  
    STUDENT arr[size];
    STUDENT temp; 
 
    // Чтение записей
    for(int i = 0; i < size; ++i)
    {    
        cout << "Enter number: ";
        cin >> arr[i].nomer; 
        cout << "Enter name: ";
        cin >> arr[i].name;    
    }  
 
    // Запись в бинарный файл
    ofstream fout("text.dat", ios::binary); 
    for(i = 0; i < size; ++i) 
    {      
        fout.write(reinterpret_cast<char*>(&arr[i]), sizeof(arr[i]));
    }
    fout.close();
    
    // чтение строк
    ifstream fin("text.dat", ios::binary); 
    
    // нормально читает вторую строку
    fin.seekg(1 * sizeof(temp), ios::beg);
    fin.read(reinterpret_cast<char*>(&temp), sizeof(temp));
    cout << "Nomer: " << temp.nomer << " Name: " << temp.name << "\n";
        
    // не читает!!
    fin.seekg(-2 * sizeof(temp), ios::end);
    fin.read(reinterpret_cast<char*>(&temp), sizeof(temp));
    cout << "Nomer: " << temp.nomer << " Name: " << temp.name << "\n";
    

    return 0;
}
Вот он весь код. Ай нид хелп(
rommster вне форума Ответить с цитированием
Старый 12.12.2012, 17:10   #5
Perchik71
С++, Delphi
Форумчанин
 
Аватар для Perchik71
 
Регистрация: 24.11.2012
Сообщений: 495
По умолчанию

ну конечно сама структура 34 байта а на деле записываешь 8.

во

write

нужно просто отправить указатель на структуру

при read тоже самое.....
Если помог, тут весы есть , Вам не сложно, а мне приятно.
Perchik71 вне форума Ответить с цитированием
Старый 12.12.2012, 17:14   #6
Perchik71
С++, Delphi
Форумчанин
 
Аватар для Perchik71
 
Регистрация: 24.11.2012
Сообщений: 495
По умолчанию

Код:
inf.write(&students[n], sizeof(student));
/////
и это.... поправь for а то он затёртый каой-то...
и вместо ++i нужно i++;
Если помог, тут весы есть , Вам не сложно, а мне приятно.

Последний раз редактировалось Perchik71; 12.12.2012 в 17:19. Причина: не заметил
Perchik71 вне форума Ответить с цитированием
Старый 12.12.2012, 17:26   #7
rommster
Пользователь
 
Регистрация: 05.10.2010
Сообщений: 46
По умолчанию

Ок! А в чем собственно у меня отличие было? Без каста ругается компилятор. Этот код работает как и прежний:

Код:
#include <iostream>
#include <cstdlib>
#include <vector>
#include <fstream>
#include <cstring>

using namespace std;

struct STUDENT 
{ 
    int nomer; 
    char name[30];  
}; 
 
int main() 
{      
    int i, j; 
    int size = 5;
  
    STUDENT arr[size];
    STUDENT temp; 
 
    // Чтение записей
    for(int i = 0; i < size; ++i)
    {    
        cout << "Enter number: ";
        cin >> arr[i].nomer; 
        cout << "Enter name: ";
        cin >> arr[i].name;    
    }  
 
    // Запись в бинарный файл
    ofstream fout("text.dat", ios::binary); 
    for(i = 0; i < size; ++i) 
    {      
        fout.write(reinterpret_cast<char*>(&arr[i]), sizeof(STUDENT));
    }
    fout.close();
    
    // чтение строк
    ifstream fin("text.dat", ios::binary); 
    
    // нормально читает вторую строку
    fin.seekg(1 * sizeof(temp), ios::beg);
    fin.read(reinterpret_cast<char*>(&temp), sizeof(STUDENT));
    cout << "Nomer: " << temp.nomer << " Name: " << temp.name << "\n";
        
    // не читает!!
    fin.seekg(-2 * sizeof(temp), ios::end);
    fin.read(reinterpret_cast<char*>(&temp), sizeof(STUDENT));
    cout << "Nomer: " << temp.nomer << " Name: " << temp.name << "\n";
    

    return 0;
}
Размер выдает одинаковый 36 байт, хоть имя структуры пиши, хоть имя переменной.
Код:
STUDENT temp; 
std::cout << sizeof(temp);
rommster вне форума Ответить с цитированием
Старый 12.12.2012, 17:27   #8
rommster
Пользователь
 
Регистрация: 05.10.2010
Сообщений: 46
По умолчанию

Цитата:
Сообщение от Perchik71 Посмотреть сообщение
и это.... поправь for а то он затёртый каой-то...
и вместо ++i нужно i++;
Это форум так отображает я не при чем.

++i нужно
rommster вне форума Ответить с цитированием
Старый 12.12.2012, 17:29   #9
Perchik71
С++, Delphi
Форумчанин
 
Аватар для Perchik71
 
Регистрация: 24.11.2012
Сообщений: 495
По умолчанию

проверил пашет.....

Код:
int main(int argc, char* argv[])
{
        int i, j;

        STUDENT arr[5];
        STUDENT temp;

    for(int i = 0; i < 5; i++)
    {
        cout << "Enter number: ";
        cin >> arr[i].nomer; 
        cout << "Enter name: ";
        cin >> arr[i].name;    
    }
 
    ofstream fout("text.dat", ios::binary);
    for(i = 0; i < 5; i++)
        fout.write((char*)&arr[i], sizeof(STUDENT));
    fout.close();

    ifstream fin("text.dat", ios::binary); 
    
    fin.seekg(1 * sizeof(STUDENT), ios::beg);
    fin.read((char*)&temp, sizeof(STUDENT));
    cout << "Nomer: " << temp.nomer << " Name: " << temp.name << "\n";
        
    fin.seekg(-2 * sizeof(STUDENT), ios::end);
    fin.read((char*)&temp, sizeof(STUDENT));
    cout << "Nomer: " << temp.nomer << " Name: " << temp.name << "\n";

    system("pause");

    return 0;
}
Если помог, тут весы есть , Вам не сложно, а мне приятно.
Perchik71 вне форума Ответить с цитированием
Старый 12.12.2012, 17:37   #10
rommster
Пользователь
 
Регистрация: 05.10.2010
Сообщений: 46
По умолчанию

У тебя разные значения выводит? У меня одно и то же. Которое первым поиском нашлось. Вот эти строки попробуй закомментить:

Код:
fin.seekg(1 * sizeof(STUDENT), ios::beg);
fin.read((char*)&temp, sizeof(STUDENT));
cout << "Nomer: " << temp.nomer << " Name: " << temp.name << "\n";
rommster вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
чтение данных из файла и запись в в массив.как чтобы до конца читал? Fundorin Общие вопросы C/C++ 0 15.11.2011 18:10
Чтение и запись структуры в бинарный файл. jack291 Помощь студентам 2 20.08.2011 18:07
Получать записи с конца Query us4us БД в Delphi 2 26.05.2011 00:23
Чтение и запись структуры в бинарный файл Bed Alice Общие вопросы C/C++ 1 09.11.2010 21:17
Чтение содержимого страницы происходит не до конца SpaceIQ Общие вопросы .NET 0 26.04.2010 16:33