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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 27, средняя оценка - 4.85
Ree.exe
56 / 56 / 4
Регистрация: 01.08.2011
Сообщений: 141
#1

методы seekg и seekp - C++

20.04.2012, 01:26. Просмотров 3510. Ответов 3
Метки нет (Все метки)

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
void my_work(const char *str, double KV) throw (myError)
{
    fstream File(str, ios::in | ios::out | ios::binary);
    if(File.is_open())
    {
        double num;
        if( !File.eof())
            do
            {
                File.read((char*)&num, sizeof(num));
                if(num < 0)
                {
                    streamoff x = File.tellg();
                    x -= sizeof(num) ;
                    File.seekp(x);
                    File.write((char*)&KV, sizeof(num));
                    /*File.seekg(x + sizeof(num));*/
                }
            }while(!File.eof());
 
        File.close();
    }
    else
        throw FEr;
}
Сам вопрос в том почему с закоментированной строкой 17 метод read не изменяет число num, и цикл крутится вечно? Хотя при этом позиция чтения меняется?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.04.2012, 01:26     методы seekg и seekp
Посмотрите здесь:

Разница между seekg() и seekp() - C++
В чём же разница? Вот допустим открыл я файл: fstream file(&quot;trans.dat&quot;,ios::out|ios::in|ios::binary); Какая разница между...

Различия в использовании seekg и seekp при работе с fstream - C++
Если я использую класс fstream, тогда для перемещения внутри файла без разницы какую функцию использовать (seekg() и seekp())??? ...

Какие различия у функций seekg и seekp для работы с файлами? - C++
Есть такая формулировка: seekg случайный доступ к потоку ввода seekp случайный доступ к потоку вывода Отсюда...

Seekp() Не слушается - C++
Добрый день . Изучаю C++ по книге . Использую Visual studio 2013. При решении задач возникла трудность с использованием функции...

Не работает seekp() - C++
Здорова господа!!! У меня вообщем проблемка я от отрываю файл для редактирования ios::app курсор в конце файла затем делаю seekp(0)...

Функция seekg - C++
Не могу понять как применить функцию seekg так, чтобы она ставила указатель на k-ую строку массива. помогите исправить пожалуйста, место...

Не запускается програма с seekg - C++
У меня возникает проблема с использованием seekg с этим кодом программа не запускается // load a file into memory #include &lt;iostream&gt; ...

seekg() не срабатывает по окончанию файла - C++
почему когда чтение доходит до третей записи (в файле всего три стройчки с int, char и int величинами) то метод seekg(); опять не...

Обработка файлов. Функция seekg(); - C++
ifstream fileReader(&quot;sdf.txt&quot;); int a; while (fileReader &gt;&gt; a) { ...; } А теперь, чтобы повторить данный while нужно написать ...

Функция seekg() как работает? - C++
Надо считывать из бинарного файла числа, которые стоят на четных позициях. Надо использовать seekg(), но как она работает, можете...

Как работает команда seekg? - C++
Всем привет!!! Объясните пожалуйста на примере как работает функция seekg? пробовал искать в поиске, о ней но ничего дельного и ясного...

перетирание байтов с использованием seekp + write в бинарных файлах - C++
Привет, возник вопрос с записью бинарных файлов. пишу в файл данные таким кодом : ofstream file1; ...


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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
soon
2538 / 1303 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
20.04.2012, 03:07     методы seekg и seekp #2
Покажите файл с входными данными
Avazart
7102 / 5279 / 267
Регистрация: 10.12.2010
Сообщений: 23,284
Записей в блоге: 17
20.04.2012, 03:33     методы seekg и seekp #3
fstream не работает и чтение и запись
-=ЮрА=-
Заблокирован
Автор FAQ
20.04.2012, 10:42     методы seekg и seekp #4
Ree.exe,
Цитата Сообщение от Ree.exe Посмотреть сообщение
File(str, ios::in | ios::out | ios::binary);
-
во первых в файле числа должны быть записаны в двоичном режиме(даже если не будет флага ios::binary мы же
Цитата Сообщение от Ree.exe Посмотреть сообщение
File.read
читаем двоичное предсталение числа а не производим потоковый ввод >>)
Вот посмотри как выглядит вполне корректный файл со значениеми write/read
p@ffffff'@ @НММММЊQ@fffff¦J@ffffff$@333333@ Ђ>@ p@ffffff$@ p@љ™™™™R@fffffR@НММММЊQ@НМММММI@
во вторых : файл открыт в режиме чтение/запись - у него нет конца, т.к. дописав ещё одно значение вконец мы тем самым EOF передвинем. Критерием достижения конца файла может служить соответствие текущей позиции файла, его длинне
условие останова чтения/записи
C++
1
2
3
4
File.seekp(0,ios::end);
        len = File.tellp();
        File.seekp(0,ios::beg);
        while(File.tellp() < len && bRet)


Ниже код алгоритма рандомно генерирующего 15 вещественных чисел в диапазоне -50 50, которые затем записывается в файл. Посредством my_work мы производим перезапись отрицательных чисел на значение 256 и после перезаписи считываем файл чтобы проверить данные в нём
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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
#include <iostream>
#include <fstream>
#include <ctime>
using namespace std;
 
//ÔóГ*êöèÿ Г§Г*ïîëГ*ГЁГІ ГґГ*éë szPath 
//n ГўГҐГ№ГҐГ±ГІГўГҐГ*Г*ûìè Г·ГЁГ±Г«Г*ìè Гў ГЁГ*òåðâГ*ëå
bool my_fill(const char *szPath, int n);
//ÔóГ*êöèÿ ïåðåçГ*ïèñûâГ*ГҐГІ îòðèöГ*òåëüГ*ûå Г§Г*Г*Г·ГҐГ*ГЁГї Г*Г* KV
bool my_work(const char *szPath, double KV);
//ÔóГ*êöèÿ ñ÷èòûâГ*ГҐГІ Г§Г*Г*Г·ГҐГ*ГЁГї ГЁГ§ ГґГ*éëГ* szPath ГЁ ГЇГҐГ·Г*ГІГ*ГҐГІ ГЁГµ Г*Г* ГЅГЄГ°Г*Г*
bool my_read(const char *szPath);
 
int main()
{
    char szPath[256] = {0};
    cout<<"Enter path : ";
    cin.getline(szPath,255);
    if(!my_fill(szPath, 15))
        cout<<"\nError rand fill\n";
    else
    if(!my_work(szPath, 256))
        cout<<"\nError read/write\n";
    else
    if(!my_read(szPath))
        cout<<"\nRead error\n";
    else
        cout<<"\nAlgorithm successfully work\n";
    system("pause");
    return 0;
}
 
bool my_fill(const char *szPath, int n)
{
    srand(time(0));
    double num;
    cout<<"Generated sequence\n";
    bool bRet = true;//ÔëГ*ГЈ Г±ГЁГЈГ*Г*ëèçèðóþùèé Г® òîì Г·ГІГ® Г§Г*ГЇГЁГ±Гј 
    //ïðîøëa ГіГ±ГЇГҐГёГ*Г® èëè æå ïðîèçîøëГ* îøèáêГ*
    fstream File(szPath, ios::out | ios::binary );
    if(!File.is_open())
        bRet = false;
    else
    while(-1 < (n = n - 1) && (bRet = File.good()))
    {
        File.write
        (
            (char *)&(num = (rand()%1000 - rand()%500)/10.0),
            sizeof(double)
        );
        cout<<num<<" ";
    }
    File.close();
    return bRet;
}
 
bool my_work(const char *szPath, double KV)
{
    bool bRet = true;//ÔëГ*ГЈ Г±ГЁГЈГ*Г*ëèçèðóþùèé Г® òîì Г·ГІГ® Г·ГІГҐГ*ГЁГҐ 
    //Г§Г*ГЇГЁГ±Гј ïðîøëè ГіГ±ГЇГҐГёГ*Г® èëè æå ïðîèçîøëГ* îøèáêГ*
    double num;
    long pos;
    long len;
    fstream File(szPath, ios::in | ios::out | ios::binary);
    if(!File.is_open())
        bRet = false;
    else
    {
        File.seekp(0,ios::end);
        len = File.tellp();
        File.seekp(0,ios::beg);
        while(File.tellp() < len && bRet)
        {
            File.read((char*)&num, sizeof(double));
            if(bRet = File.good())//Áóäåì ГЇГЁГ±Г*ГІГј Гў ГґГ*éë òîëüêî åñëè ГіГ±ГЇГҐГёГ*Г® Г±Г·ГЁГІГ*ëè
            if(num < 0)
            {
                if(sizeof(double) <= (pos = File.tellp()))
                {
                    File.seekp(pos - sizeof(double),ios::beg);
                    File.write((char*)&KV, sizeof(double));
                    bRet = File.good();
                }
            }
        }   
    }
    File.close();
    return bRet;
}
 
bool my_read(const char *szPath)
{
    bool bRet = true;//ÔëГ*ГЈ Г±ГЁГЈГ*Г*ëèçèðóþùèé Г® òîì Г·ГІГ® Г·ГІГҐГ*ГЁГҐ 
    //ïðîøëî ГіГ±ГЇГҐГёГ*Г® èëè æå ïðîèçîøëГ* îøèáêГ*
    double num;
    cout<<"\nReaded sequence\n";
    fstream File(szPath, ios::in | ios::binary);
    if(!File.is_open())
        bRet = false;
    else
    while(!File.eof() && bRet)
    {
        File.read
        (
            (char *)&num,
            sizeof(double)
        );
        if(!File.eof())
        if(bRet = File.good())
            cout<<num<<" ";
    }
    File.close();
    return bRet;
}
Миниатюры
методы seekg и seekp  
Yandex
Объявления
20.04.2012, 10:42     методы seekg и seekp
Ответ Создать тему
Опции темы

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