Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
mariko_11
2 / 2 / 1
Регистрация: 11.03.2013
Сообщений: 64
#1

Не могу прочитать файл произвольного доступа с конца - C++

11.03.2013, 01:24. Просмотров 553. Ответов 11
Метки нет (Все метки)

Странное происходит в функции read_file, а именно не работает seekg. Почему-то читается всё время последнее значение. Почему так и что с этим делать?
QtCreator 2.4.1, XP.

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
#include <iostream>
#include <fstream>
 
#define N 10
 
using namespace std;
void write_file();
void read_file(double a[]);
void array_printout(double a[]);
 
int main()
{
    double b[N];
 
    write_file();
    read_file(b);
    array_printout(b);
 
    cout << "Hello World!" << endl;
    return 0;
}
 
void write_file()
{
    double number;
    ofstream of("test.dat", ios::out | ios::binary);
 
    for (int i=0; i<N; i++)
    {
        number=i+1;
 
        of.write((char *)&number, sizeof(number));
 
    }
 
    of.close();
}
void read_file(double a[])
{
    double d;
 
    ifstream in("test.dat", ios::in | ios::binary);
 
    for (int i=0; i<N; i++)
    {
        in.seekg(-(i+1)*(sizeof(double)), ios::end);
        in.read((char *)&d, sizeof(d));
        a[i]=d;
    }
 
 
    in.close();
}
void array_printout(double a[])
{
    cout << endl;
 
    for (int i=0; i<N; i++)
        cout << a [i] << endl;
 
    cout << endl;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.03.2013, 01:24
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Не могу прочитать файл произвольного доступа с конца (C++):

Файл произвольного доступа - C++
Читаю Дейтелов, про файлы произвольного доступа. Написал вроде как по примеру, но что-то идет не так. Идея такая - создается файл, в нем...

Файл произвольного доступа - C++
Здравствуйте, снова к файлам, такая задача. Допустим, у меня есть текстовый файл с данными - код, название, количество, и со значениями...

Файл произвольного доступа - C++
Очень прошу помощи так как не могу с ними разобраться который день, видать делаю одну и ту же ошибку но не нахожу. Создаю свой класс и...

Не могу понять как прочитать файл - C++
Вродь как двоичный файл, но прочитать не могу его.. ...

Прочитать файл в обратном порядке т.е. встать в конец файла и прочитать до начальной позиции - C++
подскажите пожалуйста как можно прочитать файл в обратном порядке т.е. стать в конец файла и прочитать до начальной позиции?

Детектировать итератор произвольного доступа - C++
здравствуйте, нужно детектировать итератор произвольного доступа... это не работает: template&lt; typename... &gt; using void_t = void; ...

11
OstapBender
584 / 523 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
11.03.2013, 02:01 #2
если с каждым прочтение вызывать rdstate()
C++
1
cout << in.rdstate() << ' ';
можно увидеть что поднимаются failbit и badbit, как решить это пока не знаю. кстати, на компиляторе от Майкрософт, данной ошибки нет.
0
mariko_11
2 / 2 / 1
Регистрация: 11.03.2013
Сообщений: 64
11.03.2013, 02:45  [ТС] #3
Неа, есть ошибка. Делаем всё то же самое в Microsoft Visual Studio 2010 Express и получаем результат ещё краше - вместо 10 теперь на консоли наблюдаем 2,64135e-308 %)

Добавлено через 16 минут
А, да, ещё вопрос. Насколько жизненно необходимо писать вот здесь ios::out ?

C++ (Qt)
1
ofstream of("test.dat", ios::out | ios::binary);
То, что тип объекта ofstream, разве недостаточно?

Ну и аналогичный вопрос насчёт ios::in вот здесь

C++ (Qt)
1
ifstream in("test.dat", ios::in | ios::binary);
0
alsav22
5426 / 4821 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
11.03.2013, 12:02 #4
Цитата Сообщение от mariko_11 Посмотреть сообщение
То, что тип объекта ofstream, разве недостаточно?
Самое простое попробовать и посмотреть на результат. Жизненно необходимо так писать, если поток для чтения И записи.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void read_file(double a[])
{
    double d;
 
    ifstream in("test.dat", ios::in | ios::binary);
 
    for (int i = 0; i < N; i++)
    {
        in.seekg(-(i + 1) * (int)(sizeof(double)), ios::end);
        in.read((char *)&d, sizeof(d));
        a[i]=d;
    }
    
    in.close();
}
0
mariko_11
2 / 2 / 1
Регистрация: 11.03.2013
Сообщений: 64
17.03.2013, 16:56  [ТС] #5
alsav22, нехорошо так делать. Бывают ошибки, когда один раз пронесёт, а другой нет. Да взять хотя бы какие-нибудь хождения за пределы массива: компилятор пропустит, всё вроде бы работает как ожидается при тестировании, а вот нехорошо тем не менее, и когда это скажется, будет непонятно, где проблема. Так что лучше знать наверняка. Но вообще спасибо за ответ.

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
 
using namespace std;
 
int main()
{
    int x[10];
 
    for (int i=0; i<=10; i++)
        x[i]=i;
 
    for (int i=0; i<=10; i++)
        cout << x[i] << endl;
 
    return 0;
}
0
alsav22
5426 / 4821 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
17.03.2013, 17:17 #6
Цитата Сообщение от mariko_11 Посмотреть сообщение
alsav22, нехорошо так делать.
Это о чём? Поняли где ошибка была?
0
mariko_11
2 / 2 / 1
Регистрация: 11.03.2013
Сообщений: 64
17.03.2013, 17:46  [ТС] #7
alsav22, я о том, что способ "сделать и посмотреть, что будет", - ненадёжен.

А так - главный вопрос темы остаётся в силе.
0
alsav22
5426 / 4821 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
17.03.2013, 17:47 #8
Цитата Сообщение от mariko_11 Посмотреть сообщение
А так - главный вопрос темы остаётся в силе.
Код из 4 поста не работает?!
Цитата Сообщение от alsav22 Посмотреть сообщение
Поняли где ошибка была?
0
mariko_11
2 / 2 / 1
Регистрация: 11.03.2013
Сообщений: 64
17.03.2013, 18:12  [ТС] #9
alsav22, работает, но почему не работал мой код - непонятно. Зачем здесь приведение типа? И почему получается читать из того же файла, например, через одно значение, отсчитывая от начала, используя всё ту же seekg с sizeof?
0
alsav22
5426 / 4821 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
17.03.2013, 18:17 #10
Цитата Сообщение от mariko_11 Посмотреть сообщение
Зачем здесь приведение типа?
В вашем коде, здесь:
Цитата Сообщение от mariko_11 Посмотреть сообщение
in.seekg(-(i+1)*(sizeof(double)), ios::end);
компилятор, из-за того что sizeof() возвращает беззнаковое целое, всё выражение приводит к этому типу. Вместо отрицательного индекса получается положительный. После приведения типа, индекс будет иметь знак.
1
mariko_11
2 / 2 / 1
Регистрация: 11.03.2013
Сообщений: 64
17.03.2013, 18:49  [ТС] #11
Ну опаньки. Мне почему-то всегда казалось, что unsigned int ниже int. Понятно.

Правда, остаётся вопрос, почему у OstapBender первый код сработал на майкрософтовском компиляторе.
0
alsav22
5426 / 4821 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
17.03.2013, 19:25 #12
Цитата Сообщение от mariko_11 Посмотреть сообщение
Правда, остаётся вопрос, почему у OstapBender первый код сработал на майкрософтовском компиляторе.
Не знаю. У меня на студии 2010 ошибка была.
0
17.03.2013, 19:25
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.03.2013, 19:25
Привет! Вот еще темы с ответами:

Создание файла произвольного доступа. - C++
#include &lt;iostream.h&gt; #include &lt;fstream.h&gt; #include &lt;stdlib.h&gt; #define number 100 struct clientData { int acctNum; ...

Обработка файлов произвольного доступа - C++
Создать файл, содержащий массив указателей на упорядоченные в алфавитном порядке строки, представленные записями переменной длины....

Пишу итератор произвольного доступа - C++
Пишу итератор произвольного доступа. По минимуму он должен поддерживать несколько операций, но меня смутила операция n+it, где n это целое...

Создание файла произвольного доступа - C++
Здравствуйте.Ни как не могу разобраться с файлами произвольного доступа.Но эта тема посвящена именно созданию таких файлов. #include...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

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