Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
13 / 13 / 0
Регистрация: 31.12.2011
Сообщений: 83
1

Указатели файлов

12.02.2012, 14:01. Показов 744. Ответов 1
Метки нет (Все метки)

Добрый день всем! Сразу прошу не поливать грязью, мол "стопицот раз говорилось". Проблема с режимами ios::ate и ios::app при открытии файла для записи. Перелопатил гугл, на этом форуме была тема и везде один ответ: ios::ate - указатель для записи смещается в конец, при этом только один раз, а указатель ios::app - СТРОГО в конец (т.е. каждый раз при записи). Сразу начну с того, что в книге Лафоре (для меня авторитетная книга) сказано, что ate - смещение указателя ЧТЕНИЯ, а app - записи.
Сразу начну вот с этого (предполагается, что данные были в файле):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <fstream>
 
using namespace std;
 
class Test
{
public:
    int a;
    int b;
};
 
int main()
{
    ofstream out("Test.bin", ios::out | ios::binary | ios::app);
    ....
    cout << out.tellp() << endl;    // ПОЧЕМУ 0?!?! Записывает правильно, но почему сразу 0!?
}
А теперь вот это (тот самый ate, который ПЕРЕЗАПИСЫВАЕТ, а не добавляет в конец). Для подтверждения дважды запустите программу (первый раз должна записать, насколько я из великого Гугла понял, а второй ДОПИСАТЬ! ):
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
#include <iostream>
#include <fstream>
#include <iomanip>
#include <locale>
 
using namespace std;
 
class Student
{
private:
    char itsName[20];
 
    int  itsAge;
    int  itsGroup;
    int  itsCours;
 
public:
    Student(char *, int, int, int);
   ~Student();
 
   void PrintAbout() const;
};
 
Student::Student(char *_itsName, int a, int b, int c)
{
    strcpy(itsName, _itsName);
    itsAge   = a;
    itsGroup = b;
    itsCours = c;
}
 
Student::~Student()
{
}
 
void Student::PrintAbout() const
{
    cout << setw(10) << "Имя: "     << itsName  << endl;
    cout << setw(10) << "Возраст: " << itsAge   << endl;
    cout << setw(10) << "Группа: "  << itsGroup << endl;
    cout << setw(10) << "Курс: "    << itsCours << endl;
}
 
int main()
{
    setlocale(LC_ALL, "rus");
 
    ofstream xout("Student.bin", ios::out | ios::ate | ios::binary);
 
    Student one  ("Natalya", 20, 3, 1);
    Student two  ("Zhenya" , 21, 2, 2);
    Student three("Nastya" , 18, 1, 1);
 
    xout.write( (char*)(&three), sizeof(Student) );
 
    xout.close();
}
p.s. и, чтоб уж совсем все разъяснить по поводу смещения указателей - почему, если писать -sizeof(...) или -1*sizeof(...) в seekp(...) или seekg(...), то чтение / запись некорректна. Но если же инициализировать так, как ниже, то все в норме:
C++
1
2
3
4
.....
int a = sizeof(...);
xout.seekg(-a, ios::cur);
....
Заранее благодарен!

Не по теме:

по разным "направлениям" вроде бы не скакал, тема глобальная "Указатели файлов", поэтому не надо мне тыкать, что слишком много вопросов (пр. 1 Вопрос - 1 Тема).



Добавлено через 34 минуты
Забыл добавить:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
....
int main()
{
    setlocale(LC_ALL, "rus");
 
    ifstream xout("Student.bin", ios::in | ios::ate | ios::binary);
 
    Student one  ("Natalya", 20, 3, 1);
    Student two  ("Zhenya" , 21, 2, 2);
    Student three("Nastya" , 18, 1, 1);
 
    cout << xout.tellg() << endl;
 
    xout.close();
}
Прошу обратить внимание -> здесь же, в отличие от случая с app, указатель ЧТЕНИЯ сразу же смещен на 32 байта (подразумевается, что в файле уже есть 1 студент), в отличие от случая с app.
p.s. об этом свидетельствует xout.tellg().
p.s.s. выходит, что ate - смещение указателя чтения, и только его?
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.02.2012, 14:01
Ответы с готовыми решениями:

Указатели и указатели на указатели, а также типы данных
Недавно начал изучать Си, перешел с Delphi. Много непонятного и пока процесс идет медленно....

Через указатели на указатели посчитать сумму двух чисел и записать в третье
1. Через указатели на указатели посчитать сумму двух чисел и записать в третье. 2. Написать...

Почему Лафоре использует указатели на указатели, вместо обмена значениями указателей?
Доброго времени суток! Задался теоретическим вопросом. Читал пример из книги Лафоре...

Есть три переменные. Используя указатели на указатели, поменять значение максимальной и минимальной переменной
Мой код. #include &lt;iostream&gt; #include &lt;stdlib.h&gt; #include&lt;iomanip&gt; using namespace std; ...

1
Жарю без масла
867 / 749 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
12.02.2012, 15:59 2
ate указывает, что указатель будет перемещен в конец сразу(!) после открытия файла.
app указывает, что указатель будет перемещен в конец перед каждой(!) записью(!) в файл.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.02.2012, 15:59

Указатели на указатели с числами. Почему можно присвоить число в 4-ый элемент, если массив из 2 элементов?
Есть массив int **mas; mas=new int*; // выделил место под пять строк, верно ? mas=new int;//...

Указатели на указатели, как правильно разыменовать, где ошибка?
1)Есть класс: Shape - абстрактный; у него есть классы наследники: Circle, Triangle. 2)Eсть...

Указатели на указатели: для чего они могут понадобятся?
Изучаю C++, дошёл до указателей на указатели. Там пишут что эта тема не обязательна. Для чего они...

Отсортировать массив и вывести на экран (массивы и указатели на указатели)
Даны массивы F-фамилий студентов и S-результаты сессии (5 оценок) , причем s- результат сессии F...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru