Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.81/26: Рейтинг темы: голосов - 26, средняя оценка - 4.81
1 / 1 / 0
Регистрация: 18.03.2012
Сообщений: 110
1

Добавление структуры в файл

25.11.2012, 00:52. Показов 4748. Ответов 56
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Вечер добрый! В задании сказано, реализовать просмотров содержания файла(т.е. вывод всех структур), также структуры, удаление и подсчёт общего количества книг. При написании кода, столкнулся с проблемой добавлении структуры в файл, при компиляции позволяет ввести автора, и название книги, но в сам файл этого не добавляет. Подскажите, как мне решить проблему?

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
#include <iostream>
#include <windows.h>
#include <conio.h>
 
struct BOOK
{
    char Author[50];
    char Name[50];
    int Quantity;
};
 
//struct BOOK edit[3];
//int N = 3;        Возможна проблема здесь, не уверен.
//HANDLE *hFile;
 
 
 
 
void add();
void del();
void equal();
void prosmotr();
 
using namespace std;
 
void enter()
{
 
for(int i = 0; i < N; i++)
{
  printf("Vvedite avtora knigi:\n");
  scanf("%s", &edit[i].Author);
}
 
for(int k = 0; k < N; k++)
{
  printf("Vvedite nazvanie knigi:\n");
  scanf("%s", &edit[k].Name);
}
WriteFile(hFile, &edit, sizeof(edit), NULL, NULL);
}
 
void main()
{
    HANDLE hFile;
    hFile = CreateFile("book.dat",GENERIC_WRITE,0,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
    if (hFile!=INVALID_HANDLE_VALUE)
    {
        cout<<"book.dat "<<GetLastError()<<endl;
 
        FILETIME CreationTime, LastAccessTime, LastWriteTime;
        GetFileTime(hFile, &CreationTime, &LastAccessTime, &LastWriteTime);
        cout<<CreationTime.dwHighDateTime<<endl;
 
        SYSTEMTIME SystemTime;
        FileTimeToSystemTime(&CreationTime, &SystemTime);
        cout<<SystemTime.wDay<<'.'<<SystemTime.wMonth<<'.'<<SystemTime.wYear<<endl;
        cout<<SystemTime.wHour<<'.'<<SystemTime.wMinute<<'.'<<SystemTime.wSecond<<endl;
 
        BY_HANDLE_FILE_INFORMATION FileInformation;
        GetFileInformationByHandle(hFile, &FileInformation ); 
        FileTimeToSystemTime( &FileInformation.ftLastAccessTime ,&SystemTime  );
        cout <<SystemTime.wDayOfWeek <<endl;
    }
    if (hFile = CreateFile("book.dat",GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL)) 
    {
        enter();
    }
    else
    {
        ReadFile(hFile, &edit, sizeof(edit), NULL, NULL);
    }
 
    CloseHandle(hFile);
    cout<<"Press Any Key To Exit..."<<endl;
    getch();
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.11.2012, 00:52
Ответы с готовыми решениями:

Запись структуры в файл, WriteFile возвращает false
Имеестя структура, которую необходимо записать в файл. При попытке записи WriteFile возвращает...

Запись структуры в файл - Как сделать так, чтобы в файл записывались только данные структуры?
Здравствуйте! using System.Runtime.Serialization.Formatters.Binary; public struct wav {...

Добавление в файл и удаление из файла записей о объектах структуры "Фильм"
#include &lt;iostream&gt; #include &lt;stdio.h&gt; #include &lt;string.h&gt; #include &lt;stdlib.h&gt; using namespace...

Добавление элементов структуры
Здравствуйте. Очень нужна помощь. Было задано комплексное задание по структурам. Одним из...

56
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
25.11.2012, 01:19 2
Что-то ты начудил. Где у тебя определена переменная hFile, к которой в 41-й строке обращается функция WriteFile ?
0
1 / 1 / 0
Регистрация: 18.03.2012
Сообщений: 110
25.11.2012, 03:03  [ТС] 3
В 15 строке, просто скрыл коментами, чтобы указать на то место, где предпологаемо ошибка прячется
0
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
25.11.2012, 10:23 4
Цитата Сообщение от Asdf Посмотреть сообщение
В 15 строке
Ну тогда не понятно почему ты определил его как указатель.
А в 46-й строке у тебя что?
И почему ты два раза открываешь файл (47-я и 66-я) ?
0
1 / 1 / 0
Регистрация: 18.03.2012
Сообщений: 110
25.11.2012, 16:02  [ТС] 5
Забыл убрать, т.к. он там и не нужен, просто пробовал. В 46 тож можно убрать, а в 47 и 66, мне надо, чтобы сначала файл создался, а если он есть, то выдал его имя и временные атрибуты, а там где if, я только его открываю, чтобы записать в файл, OpenFile читал, что уже не используется. Или уже через 47 файл у меня уже открытый получается?
0
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
25.11.2012, 16:05 6
Я ничего не понял. Покажи исправленный код.
0
1 / 1 / 0
Регистрация: 18.03.2012
Сообщений: 110
25.11.2012, 16:08  [ТС] 7
Вот.

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
#include <iostream>
#include <windows.h>
#include <conio.h>
 
struct BOOK
{
    char Author[50];
    char Name[50];
    int Quantity;
};
 
struct BOOK air[3];
int N = 3;
HANDLE hFile;
 
 
 
void add();
void del();
void equal();
void prosmotr();
 
using namespace std;
 
void enter()
{
 
for(int i = 0; i < N; i++)
{
  printf("Vvedite avtora knigi:\n");
  scanf("%s", &air[i].Author);
}
 
for(int k = 0; k < N; k++)
{
  printf("Vvedite nazvanie knigi:\n");
  scanf("%s", &air[k].Name);
}
WriteFile(hFile, &air, sizeof(air), NULL, NULL);
}
 
void main()
{
    //HANDLE hFile;
    hFile = CreateFile("book.dat",GENERIC_WRITE,0,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
    if (hFile!=INVALID_HANDLE_VALUE)
    {
        cout<<"book.dat "<<GetLastError()<<endl;
        FILETIME CreationTime, LastAccessTime, LastWriteTime;
        GetFileTime(hFile, &CreationTime, &LastAccessTime, &LastWriteTime);
        cout<<CreationTime.dwHighDateTime<<endl;
        SYSTEMTIME SystemTime;
        FileTimeToSystemTime(&CreationTime, &SystemTime);
        cout<<SystemTime.wDay<<'.'<<SystemTime.wMonth<<'.'<<SystemTime.wYear<<endl;
        cout<<SystemTime.wHour<<'.'<<SystemTime.wMinute<<'.'<<SystemTime.wSecond<<endl;
        BY_HANDLE_FILE_INFORMATION FileInformation;
        GetFileInformationByHandle(hFile, &FileInformation ); 
        FileTimeToSystemTime( &FileInformation.ftLastAccessTime ,&SystemTime  );
        cout <<SystemTime.wDayOfWeek <<endl;
    }
    if (hFile = CreateFile("book.dat",GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL)) 
    {
        enter();
    }
    else
    {
        ReadFile(hFile, &air, sizeof(air), NULL, NULL);
    }
 
    CloseHandle(hFile);
    cout<<"Press Any Key To Exit..."<<endl;
    getch();
}
0
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
25.11.2012, 16:16 8
Цитата Сообщение от Asdf Посмотреть сообщение
Или уже через 47 файл у меня уже открытый получается?
Конечно.
Закрой его между 60-й и 61-й строкой (последний код).
0
1 / 1 / 0
Регистрация: 18.03.2012
Сообщений: 110
25.11.2012, 16:23  [ТС] 9
Закрыл. Получается, когда в if, я открываю файл, то можно так и оставить в CreateFile(OPEN_EXISTING) или, что то другое ставить?
0
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
25.11.2012, 16:36 10
Можно так и оставить. Первый CreateFile гарантирует то что файл существует.
0
1 / 1 / 0
Регистрация: 18.03.2012
Сообщений: 110
25.11.2012, 16:38  [ТС] 11
Но всёравно ничего не записывается в файл. ( Где я накололся?
0
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
25.11.2012, 16:47 12
WriteFile предпоследний параметр не может быть равен NULL, если последний NULL.
Сделай так:
C
1
2
3
DWORD dwWritten;
...
WriteFile( hFile, &air, sizeof( air ), &dwWritten, NULL );
0
1 / 1 / 0
Регистрация: 18.03.2012
Сообщений: 110
25.11.2012, 16:54  [ТС] 13
dwWritten это то, сколько байтов всего записано?
0
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
25.11.2012, 16:55 14
В 32-й и 38-й строках знак амперсанда не нужен.

Добавлено через 35 секунд
Цитата Сообщение от Asdf Посмотреть сообщение
dwWritten это то, сколько байтов всего записано?
Да, сколько записалось. Её можно не использовать, но в функцию передать надо.
0
1 / 1 / 0
Регистрация: 18.03.2012
Сообщений: 110
25.11.2012, 17:02  [ТС] 15
Т.е. ты имел ввиду 33, 39?

Добавлено через 57 секунд
Понятно.

Добавлено через 4 минуты
Получается с ReadFile в 68 строке тоже нельзя оставить в предпоследнем параметре NULL?
0
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
25.11.2012, 17:06 16
Цитата Сообщение от Asdf Посмотреть сообщение
Т.е. ты имел ввиду 33, 39?
Нет, 32 и 38 из 7-го поста.
Цитата Сообщение от Asdf Посмотреть сообщение
Получается с ReadFile в 68 строке тоже нельзя оставить в предпоследнем параметре NULL?
Да, там такая же ситуация.
0
1 / 1 / 0
Регистрация: 18.03.2012
Сообщений: 110
25.11.2012, 17:09  [ТС] 17
А dwWritten можно оставить не давая ему никаких значений? Просто DWORD dwWritten?
0
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
25.11.2012, 17:12 18
Да, можно.
0
1 / 1 / 0
Регистрация: 18.03.2012
Сообщений: 110
25.11.2012, 17:37  [ТС] 19
Так, пока что всёравно файл пустой

Добавлено через 16 минут
То, что сейчас есть, но не записывается ничего в файл.
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
#include <iostream>
#include <windows.h>
#include <conio.h>
 
struct BOOK
{
    char Author[50];
    char Name[50];
    int Quantity;
};
 
struct BOOK air[3];
int N = 3;
HANDLE hFile;
 
 
 
void add();
void del();
void equal();
void prosmotr();
 
using namespace std;
 
void add()
{
DWORD dwWritten;
 
for(int i = 0; i < N; i++)
{
  printf("Vvedite avtora knigi:\n");
  scanf("%s", air[i].Author);
}
 
for(int k = 0; k < N; k++)
{
  printf("Vvedite nazvanie knigi:\n");
  scanf("%s", air[k].Name);
}
WriteFile(hFile, &air, sizeof(air), &dwWritten, NULL);
}
 
void main()
{
    //HANDLE hFile;
    hFile = CreateFile("book.dat",GENERIC_WRITE,0,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
    if (hFile!=INVALID_HANDLE_VALUE)
    {
        cout<<"book.dat "<<GetLastError()<<endl;
        FILETIME CreationTime, LastAccessTime, LastWriteTime;
        GetFileTime(hFile, &CreationTime, &LastAccessTime, &LastWriteTime);
        cout<<CreationTime.dwHighDateTime<<endl;
        SYSTEMTIME SystemTime;
        FileTimeToSystemTime(&CreationTime, &SystemTime);
        cout<<SystemTime.wDay<<'.'<<SystemTime.wMonth<<'.'<<SystemTime.wYear<<endl;
        cout<<SystemTime.wHour<<'.'<<SystemTime.wMinute<<'.'<<SystemTime.wSecond<<endl;
        BY_HANDLE_FILE_INFORMATION FileInformation;
        GetFileInformationByHandle(hFile, &FileInformation ); 
        FileTimeToSystemTime( &FileInformation.ftLastAccessTime ,&SystemTime  );
        cout <<SystemTime.wDayOfWeek <<endl;
        CloseHandle(hFile);
    }
    if (hFile = CreateFile("book.dat",GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL)) 
    {
        add();
    }
    else
    {
        DWORD dwReading;
        ReadFile(hFile, &air, sizeof(air), &dwReading, NULL);
    }
 
    CloseHandle(hFile);
    cout<<"Press Any Key To Exit..."<<endl;
    getch();
}
0
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
25.11.2012, 17:50 20
Откомпилировал ничего не изменяя. Все записывается.
0
25.11.2012, 17:50
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.11.2012, 17:50
Помогаю со студенческими работами здесь

Добавление в конец списка новой структуры
Всем привет! Задание следующее Разработать программу для создания и работы с двусвязным списком,...

Добавление экземпляра структуры в конец коллекции
У меня задание: . Структура &quot;Человек&quot;: - фамилия, имя, отчество; - ...

Добавление, вставка и удаления элемента структуры
добавить операции добавление, вставка и удаления элемента с интерактивного меню #include...

Файл содержит количество столбцов матрицы. Создать файл той же структуры, содержащий произведение А*В
Задача: Даны два файла вещественных чисел с именами NameA и NameB, содержащие элементы...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru