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

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

Войти
Регистрация
Восстановить пароль
 
|| Flashka ||
2 / 2 / 0
Регистрация: 03.03.2010
Сообщений: 94
#1

Не могу спроецировать файл!!! ((( - C++

20.05.2010, 10:26. Просмотров 572. Ответов 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
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
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(LC_CTYPE,"Russian");
    printf("\n\nОжидание...\n\n");
 
    int arrayOfNumbers[MAX_QUANTITY];
        int tmp, searchingNumber, position;
        int  theLeftElement
             ,ridhtElement
             ,number     = NULL
             ,buffer     = NULL
             ,variable1  = NULL
             ,variable2  = NULL;
       int sizeOfaFile = NULL;
       int* numberOfaFile;
       bool CorrectnessCheck;
 
       numberOfaFile = (int *) malloc (sizeOfaFile);
 
       HANDLE Mapping;
       DWORD NumberOfBytesRead;
 
 
    Mapping = CreateFileMapping( File
                                , NULL         
                                , PAGE_READWRITE  
                                , 0               
                                , sizeOfaFile * sizeof(int)    
                                , L"Mas"
                               ); 
    Map1 = (int *)MapViewOfFile(Mapping, FILE_MAP_ALL_ACCESS, 0, 0, sizeOfaFile * sizeof(int));
 
    memcpy (arrayOfNumbers, Map1, sizeOfaFile * sizeof(int)); //копируем массив данных в память
 
    Mapping = CreateFileMapping( File
                                 , NULL         
                                 , PAGE_READWRITE  
                                 , 0               
                                 , sizeof(searchingNumber)    
                                 , L"Mas"
                                 );         
        
    Map2 = (int *)MapViewOfFile(Mapping, FILE_MAP_ALL_ACCESS, 0, 0, sizeof(searchingNumber));
 
    memcpy (&searchingNumber, Map2, sizeof(searchingNumber)); //копируем массив данных в память
 
    printf("\nПолучено\n");
 
    printf("\nВектор: %d\n", arrayOfNumbers);
    printf("Ключ: %d\n", searchingNumber);
 
    cout << endl;
    position = searchBinary(arrayOfNumbers
                            , searchingNumber, 0
                            , MAX_QUANTITY - 1
                            );
    position != -1 ? cout << "Искомая позиция: " << position+1
                   : cout << "Нет такого элемента!"
                   ;
    UnmapViewOfFile (Map1);
    UnmapViewOfFile (Map2);
    CloseHandle (Mapping);
    CloseHandle (File);
    cin.get();
}
int searchBinary(int* p_Array, int g_KeySearch, int head, int tail)
{ 
    int currPosition = ELEMENT;
    if ((tail == head) && (p_Array[tail] != g_KeySearch )) 
    {
        return ELEMENT;
    }
    else 
    {
        currPosition = (head+tail)/2;
        if (g_KeySearch == p_Array[currPosition])
        {
            return currPosition;
        }
        else 
        {
            if (g_KeySearch > p_Array[currPosition]) 
            {
                currPosition = searchBinary(p_Array, g_KeySearch, head, currPosition);
            }
            else
            {
                currPosition = searchBinary(p_Array, g_KeySearch, currPosition+1, tail);
            }
        }
    }
}
Клиент:
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
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(LC_CTYPE,"Russian");
 
    int arrayOfNumbers[MAX_QUANTITY];
    int tmp, searchingNumber = NULL, position;
    int  theLeftElement
        ,ridhtElement
        ,number     = NULL
        ,buffer     = NULL
        ,variable1  = NULL
        ,variable2  = NULL;
    int sizeOfaFile = NULL;
    int *numberOfaFile;
    bool CorrectnessCheck;
 
     do
    {
        cout << "\nВведите размер массива: ";
        cin.clear();
        cin >> sizeOfaFile;
        fflush(stdin);
 
        if(!cin.good())
        {
                cout<<"\n>>Ошибка!!! Размер должен быть числом!\n";
                cout<<"\n>>Пожалуйста, введите число. \n";
                CorrectnessCheck = false; 
        }
            else CorrectnessCheck = true; 
            }
      while (!CorrectnessCheck); 
 
     numberOfaFile = (int *) malloc (sizeOfaFile);
 
      cout << "\nВведите элементы массива: ";
 
    for( int theLeftElement=0; theLeftElement<
             sizeOfaFile; ++theLeftElement)
    {
            do
            {
                cin.clear();
                cin >> arrayOfNumbers[theLeftElement];
                fflush(stdin);
            if(!cin.good())
            {
              cout<<"\n>>Ошибка!!! Элементы должны быть числом!\n";
              cout<<"\n>>Пожалуйста, введите число. \n";
              CorrectnessCheck = false; 
            }
            else CorrectnessCheck = true; 
            }while (!CorrectnessCheck);
     } 
 
    // просматриваем элемент от начала до конца, массив начинается с 0
    for (theLeftElement = 0; theLeftElement < 
         MAX_QUANTITY-1; theLeftElement++) 
    {
        // просматриваем массив со следующего от текущего положения элемента
        for (ridhtElement = theLeftElement+1; ridhtElement < 
             MAX_QUANTITY; ridhtElement++) 
        {
            // если левый элемент меньше чем правый, то меняем их местами
            // т.о. меньшие элементы всплывают к концу массива
            if (arrayOfNumbers[theLeftElement] < 
                arrayOfNumbers[ridhtElement]) 
            {
                tmp = arrayOfNumbers[theLeftElement];
                arrayOfNumbers[theLeftElement] = arrayOfNumbers[ridhtElement];
                arrayOfNumbers[ridhtElement] = tmp; 
            }
        }
            if (arrayOfNumbers[theLeftElement] != buffer) 
            {
                buffer = arrayOfNumbers[theLeftElement];
                variable2 = 1;
            }
            else 
            {
                variable2++;
            if (variable2 > variable1)
            {
            number = buffer;
            variable1 = variable2;
            }
        }
 
    }
    
    for (theLeftElement=0; theLeftElement < sizeOfaFile; theLeftElement++) 
    {
        cout << arrayOfNumbers[theLeftElement] << " ";
    }
 
        do
        {    
            cout << endl << endl << "Введите ключ для поиска: ";
            cin.clear();
            cin >> searchingNumber;
            fflush(stdin);
 
            if(!cin.good())
            {
                cout<<"\n>>Ошибка!!! Ключ должны быть числом!\n";
                cout<<"\n>>Пожалуйста, введите число. \n";
                CorrectnessCheck = false; 
            }
            else CorrectnessCheck = true; 
            }while (!CorrectnessCheck);
 
     cout << endl;
 
    
 
     Mapping = CreateFileMapping( File
                                , NULL         
                                , PAGE_READWRITE  
                                , 0               
                                , sizeOfaFile * sizeof(int)    
                                , L"Mas"
                               ); 
 
    // Размещаем проекцию Mapping в адресном пространстве нашего процесса; Map - получает адрес размещения
    Map1 = (int *)MapViewOfFile(File, FILE_MAP_ALL_ACCESS, 0, 0, sizeOfaFile * sizeof(int));
 
    memcpy (Map1, arrayOfNumbers, sizeOfaFile * sizeof(int)); //копируем массив данных в память
 
    Mapping = CreateFileMapping( File
                               , NULL         
                               , PAGE_READWRITE  
                               , 0               
                               , sizeof(searchingNumber)    
                               , L"Mas2"
                              );         
        
     Map2 = (int *)MapViewOfFile(File, FILE_MAP_ALL_ACCESS, 0, 0, sizeof(searchingNumber));
 
     memcpy (&searchingNumber, Map2,  sizeof(searchingNumber)); //копируем массив данных в память
 
     printf("Массив записан...");
 
     printf("\nВектор: %d\n", arrayOfNumbers);
     printf("Ключ: %d\n", searchingNumber);
 
     getch();
 
     UnmapViewOfFile (Map1);
     UnmapViewOfFile (Map2);
     CloseHandle (Mapping);
     CloseHandle (File);
     return NULL;
}
Вот какая-то фигня с проецированием файла! Например ввожу элементы и ключ для поиска, а проецирует он мне вообще не понятно что и всегда одно и тоже!!! (( Помогите пожалуйста исправить... )))
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.05.2010, 10:26     Не могу спроецировать файл!!! (((
Посмотрите здесь:

Как спроецировать файл в буфер? - C++
У меня 2 вопроса: 1) Как спроецировать файл в буфер? 2) Как составить спроецированный файл в буфере?

Не могу записать в файл - C++
написал программу, числа из одного файла записывать в другой . Вчера работала а седня не работает . помогите, в чем может быть дело?\ ...

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

Не могу корректно заполнить файл - C++
В условиях задачи имеется файл a.txt и b.txt. Нужно вывести в файл c.txt содержимое a.txt в обратном порядке, а за ним b.txt в нормальном...

Не могу записать числа в файл - C++
Не получается записать числа в файл (god,price). При открытии файла заместо чисел какие то символы. Как исправить? #include&lt;iostream&gt; ...

Не могу записать результат в файл - C++
в 37 строке ругается на ofstream пишет неизвестная функция #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;cstdlib&gt; #include...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
gh05t
47 / 46 / 4
Регистрация: 03.04.2010
Сообщений: 99
20.05.2010, 11:25     Не могу спроецировать файл!!! ((( #2
По серверу:
Где у тебя инициализируется хэндл файла File? (Нужна функция CreateFile)
Почему ты маппишь файл еще до создания маппинга? (первый вызов MapViewOfFile еще до первого вызова CreateFileMapping и, соответственно, с неинициализированной переменной Mapping)

В клиенте ты, опять таки, не создаешь объект файла (не вызываешь CreateFile, не инициализируешь File). К тому же в MapViewOfFile суешь хэндл на файл (File), хотя должен на маппинг, то есть тот, который возвращает CreateFileMapping.
|| Flashka ||
2 / 2 / 0
Регистрация: 03.03.2010
Сообщений: 94
20.05.2010, 11:45  [ТС]     Не могу спроецировать файл!!! ((( #3
Mapping инициализирована перед главной функцией(не стала это тоже кидать!!) А CreateFile такая должна быть? HANDLE File = CreateFile (L"File.txt", GENERIC_READ|GENERIC_WRITE
, FILE_SHARE_WRITE|FILE_SHARE_READ
, NULL, CREATE_ALWAYS , 0, NULL
);

Добавлено через 1 минуту
А в MapViewOfFile первый параметр будет тогда Mapping?

Добавлено через 9 минут
Добавила CreateFile, все равно выдает все тоже самое!!!! (((( Значение вектора одно и тоже, ключ- первое значение, когда вектор заполняешь..... (((
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.05.2010, 11:57     Не могу спроецировать файл!!! (((
Еще ссылки по теме:

Не могу открыть файл OFSTREAM - C++
Доброго времен суток! Помогите разобраться: пытаюсь открыть файл с параметром ios::out, а он не открывается :( Почему это может...

Не могу нормально открыть файл - C++
Скачал Microsoft Visual C ++ 2010, создал пустой проект, добавил файл с вот таким кодом. #include &lt;stdio.h&gt; int main() { ...

Не могу открыть файл fstream - C++
Добрый день. Не могу открыть файл с помощью fstream файл, файл лежит в корне проекта. Пользуюсь QT creator с gcc. #include &lt;iostream&gt; ...

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

Не могу создать файл в поток ofstream - C++
Всех с наступившем НГ!) Не могу открыть/создать файл в поток. fstream somf; somf.open(&quot;c:\\users\\admin\\documents\\visual...

Не могу запустить файл в Qt Creator - я новичок - C++
Хочу написать программу &quot;Hello, world!&quot; :) Выбираю Файл - Создать - C++ - Файл исходных текстов C++ Насколько я понимаю, Файл...


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

Или воспользуйтесь поиском по форуму:
gh05t
47 / 46 / 4
Регистрация: 03.04.2010
Сообщений: 99
20.05.2010, 11:57     Не могу спроецировать файл!!! ((( #4
Вот код рабочего маппинга...
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
PVOID MapFile(TCHAR* filename)
{
    HANDLE hFile = CreateFile(filename, GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
    
    if (hFile == INVALID_HANDLE_VALUE)
        return NULL;
 
    DWORD lsize, hsize;
    lsize = GetFileSize(hFile, &hsize);
 
    HANDLE hMap = CreateFileMapping(hFile, NULL, PAGE_READWRITE, hsize, lsize, NULL);
    CloseHandle(hFile);
 
    if (!hMap)
        return NULL;
 
    PVOID result = MapViewOfFile(hMap, FILE_MAP_WRITE, 0, 0, 0);
    CloseHandle(hMap);
    
    return result;
}
Yandex
Объявления
20.05.2010, 11:57     Не могу спроецировать файл!!! (((
Ответ Создать тему
Опции темы

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