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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 12.12.2012, 18:33   #21
Perchik71
С++, Delphi
Форумчанин
 
Аватар для Perchik71
 
Регистрация: 24.11.2012
Сообщений: 495
По умолчанию

кинь ещё раз свой листинг.. который ты прям ща компилишь...
наверная где то какая то срань пропущена или ещё что-то..
Если помог, тут весы есть , Вам не сложно, а мне приятно.
Perchik71 вне форума Ответить с цитированием
Старый 12.12.2012, 18:37   #22
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 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;
}
Выводятся обе одинаковые строки. Если 37-39 закомментить, то печатает мусор.
rommster вне форума Ответить с цитированием
Старый 12.12.2012, 19:02   #23
Perchik71
С++, Delphi
Форумчанин
 
Аватар для Perchik71
 
Регистрация: 24.11.2012
Сообщений: 495
По умолчанию

херь какая то.....

но мы можем и без него обойтись...

Код:
struct STUDENT
{ 
    int nomer;
    char name[30];
};

void Saved(const STUDENT* arr, int size)
{
        int i;
        ofstream out("text.dat", ios::binary);
        for(i = 0; i < size; i++)
                out.write((char*)&arr[i], sizeof(STUDENT));
        out.close();
}

void LoadedStr(const STUDENT* s, int id)
{
        int size;
        ifstream in("text.dat", ios::binary);
        in.seekg(id * sizeof(STUDENT), ios::beg);
        in.read((char*)s, sizeof(STUDENT));
        in.close();
}

int GetSize(void)
{
        FILE *pFile = fopen("text.dat", "rb");
long nFileLen = 0;
if (pFile)
{
   fseek (pFile, 0, SEEK_END);
   nFileLen = ftell(pFile);
   fclose (pFile);
}
        return (nFileLen / sizeof(STUDENT));
}

int main(void)
{
        int i, j;

        STUDENT arr[5];
        STUDENT temp;

    // ×òåíèå çàïèñåé
    for(i = 0; i < 5; ++i)
    {
        cout << "Enter number: ";
        cin >> arr[i].nomer; 
        cout << "Enter name: ";
        cin >> arr[i].name;    
    }

    // Çàïèñü â áèíàðíûé ôàéë
    Saved(arr, 5);

    // íîðìàëüíî ÷èòàåò âòîðóþ ñòðîêó
    LoadedStr(&temp, 1);
    cout << "Nomer: " << temp.nomer << " Name: " << temp.name << "\n";

    // íå ÷èòàåò!!
    LoadedStr(&temp, GetSize() - 2);
    cout << "Nomer: " << temp.nomer << " Name: " << temp.name << "\n";

    system("pause");

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

Да, так все правильно, благодарю за помощь.

seekg с параметром ios::beg работает замечательно. Проблема у меня именно с ios::end... почему хз.
rommster вне форума Ответить с цитированием
Старый 12.12.2012, 19:55   #25
Perchik71
С++, Delphi
Форумчанин
 
Аватар для Perchik71
 
Регистрация: 24.11.2012
Сообщений: 495
По умолчанию

Скорее всего.... проблема с именами.... т.е. оно уже не то у тебя означает... ибо fseek(... SEEK_END) пашит... и ему похрен. нет ничего надёжнее чем обращение к апи.
Если помог, тут весы есть , Вам не сложно, а мне приятно.
Perchik71 вне форума Ответить с цитированием
Старый 12.12.2012, 21:17   #26
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

я не знаю ваших C, но, зачем Вам минус в процедуре Seek ?!?!?

пробуйте так:
Код:
   fin.seekg(2 * sizeof(STUDENT), ios::end);
Без всякого минуса!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 12.12.2012, 21:35   #27
Perchik71
С++, Delphi
Форумчанин
 
Аватар для Perchik71
 
Регистрация: 24.11.2012
Сообщений: 495
Радость

так нельзя

позиция будет уже 210..... короче ты к концу прибовляешь ещё... вобщем типичная ошибка range error. с конца уходят назад... с начала вперёд.

так везде даже с апи fseek
Если помог, тут весы есть , Вам не сложно, а мне приятно.
Perchik71 вне форума Ответить с цитированием
Старый 12.12.2012, 21:59   #28
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
так нельзя
а вы проверили? Или это результат ваших мыслей?

p.s. я ничего не утверждаю!
НО! на месте топикстартера я бы всё таки взял и проверил!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 12.12.2012, 22:09   #29
Perchik71
С++, Delphi
Форумчанин
 
Аватар для Perchik71
 
Регистрация: 24.11.2012
Сообщений: 495
Подмигивание Ради хорошего модератора

Код:
int i, j;

        STUDENT arr[5];
        STUDENT temp;

    for(i = 0; i < 5; ++i)
    {
        cout << "Enter number: ";
        cin >> arr[i].nomer; 
        cout << "Enter name: ";
        cin >> arr[i].name;    
    }

    Saved(arr, 5);

    LoadedStr(&temp, 1);
    cout << "Nomer: " << temp.nomer << " Name: " << temp.name << "\n";

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

    system("pause");

    return 0;
пожалуйста... даже скрин... в temp не было ничего записано.... ибо мы ушли за диапозон и in.read
как сообщает msdn возвращает ошибку -1
Изображения
Тип файла: jpg проп.jpg (36.6 Кб, 87 просмотров)
Если помог, тут весы есть , Вам не сложно, а мне приятно.
Perchik71 вне форума Ответить с цитированием
Старый 12.12.2012, 23:11   #30
rommster
Пользователь
 
Регистрация: 05.10.2010
Сообщений: 46
По умолчанию

Serge_Bliznykov, да я уж как только не пробовал и плюс и минус) Пока работает только способ с подсчетом размера, который посоветовал Perchik71. Еще раз ему благодарность.

А с инкрементами, ей-богу, впервые слышу о разнице постинкремента и преинкремента в цикле))

Последний раз редактировалось rommster; 13.12.2012 в 09:59.
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