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

Символ новой строки - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 24, средняя оценка - 5.00
vodilawofer
29 / 27 / 2
Регистрация: 27.09.2012
Сообщений: 123
16.08.2013, 18:16     Символ новой строки #1
Всем привет) С маппировал текстовый файл в память.
C++
1
2
3
4
5
6
7
HANDLE file = CreateFile(fileNameWChar, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
    
DWORD fileSize = GetFileSize(file, NULL);
 
HANDLE fileMap =  CreateFileMapping(file, NULL, PAGE_READWRITE, 0, 0, NULL);
 
char *pvFileSrc = (char *)MapViewOfFile(fileMap, FILE_MAP_WRITE, 0, 0, fileSize);
если в файле строки находятся на разных строках
пример:
cyber
forum

То в указатели pvFileSrc будет сплошной текст (cyberforum).

Пробовал strstr(pvFleSrc, "\n"), strcmp(pvFleSrc, "\n"), ничего не выходит((

Пожалуйста, подскажите как определить строку.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.08.2013, 18:16     Символ новой строки
Посмотрите здесь:

Символ новой строки в MFC C++
C++ функция getline считывает несколько строк из файла, игнорируя символ новой строки
C++ Ввести символьную строку. Распечатать каждый символ массива с новой строки
Найти символ первой строки, который первым не совпал с одним из символов второй строки. Вывести слово, в которое входит этот символ C++
C++ Как убрать символ новой строки, применяя перегруженный оператор <<?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
vodilawofer
29 / 27 / 2
Регистрация: 27.09.2012
Сообщений: 123
17.08.2013, 20:07  [ТС]     Символ новой строки #81
Цитата Сообщение от castaway Посмотреть сообщение
А как ты проверяешь что там находится?
смотрю в деббагере с помощью визуализации текста.

То нормально, то некорректно содежит инфу.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
castaway
Эксперт С++
4842 / 2981 / 367
Регистрация: 10.11.2010
Сообщений: 11,013
Записей в блоге: 10
Завершенные тесты: 1
17.08.2013, 20:18     Символ новой строки #82
Ты смотришь в дебагере лишнюю информацию. У тебя есть размер файла. Не надо выходить за границы мэппированного массива.
vodilawofer
29 / 27 / 2
Регистрация: 27.09.2012
Сообщений: 123
20.08.2013, 19:39  [ТС]     Символ новой строки #83
Я правильно понимаю? Размер маппированного файла должно быть меньше размера свободной памяти в ОЗУ?

Например, если свободно 100 мб, я не смогу с маппировать файл на 200 мб, да?
castaway
Эксперт С++
4842 / 2981 / 367
Регистрация: 10.11.2010
Сообщений: 11,013
Записей в блоге: 10
Завершенные тесты: 1
20.08.2013, 19:55     Символ новой строки #84
Если файл смэппировать по каким-то причинам не получается, тогда одна из функций ( CreateFileMapping или MapViewOfFile ) должна вернуть ошибку.
А вообще я думаю что функционал ОС позволяет смэппировать файл, размер которого больше свободного размера ОЗУ, например подгружать ту часть файла к которой ты обращаешься.
К тому же, что мешает тебе это попробовать чтобы лично в этом убедится?
vodilawofer
29 / 27 / 2
Регистрация: 27.09.2012
Сообщений: 123
20.08.2013, 20:09  [ТС]     Символ новой строки #85
Цитата Сообщение от castaway Посмотреть сообщение
Если файл смэппировать по каким-то причинам не получается, тогда одна из функций ( CreateFileMapping или MapViewOfFile ) должна вернуть ошибку.
А вообще я думаю что функционал ОС позволяет смэппировать файл, размер которого больше свободного размера ОЗУ, например подгружать ту часть файла к которой ты обращаешься.
К тому же, что мешает тебе это попробовать чтобы лично в этом убедится?
я пробую чуть меньше 1гб маппирует. а уже 1.5 нет( .
функция getlasterror выдала ошибку №8. это, вроде как, недостаточно место.
castaway
Эксперт С++
4842 / 2981 / 367
Регистрация: 10.11.2010
Сообщений: 11,013
Записей в блоге: 10
Завершенные тесты: 1
20.08.2013, 20:15     Символ новой строки #86
Цитата Сообщение от vodilawofer Посмотреть сообщение
я пробую чуть меньше 1гб маппирует. а уже 1.5 нет( .
А свободной памяти при этом сколько?

На днях обсуждалась тема, там парень аналог ArtMoney писал, так вот там есть пример того как мэппировать файл по частям с помощью функции VirtualQueryEx, только его нужно немного довести до ума..
vodilawofer
29 / 27 / 2
Регистрация: 27.09.2012
Сообщений: 123
20.08.2013, 20:19  [ТС]     Символ новой строки #87
Цитата Сообщение от castaway Посмотреть сообщение
А свободной памяти при этом сколько?

На днях обсуждалась тема, там парень аналог ArtMoney писал, так вот там есть пример того как мэппировать файл по частям с помощью функции VirtualQueryEx, только его нужно немного довести до ума..
примерно меньше 1 гб.
а ссылочку не подкинете? или в каком разделе искать.
castaway
Эксперт С++
4842 / 2981 / 367
Регистрация: 10.11.2010
Сообщений: 11,013
Записей в блоге: 10
Завершенные тесты: 1
20.08.2013, 20:21     Символ новой строки #88
Хотя нет, вру, там немного другое было. В общем не суть. Если не хватает ОЗУ - просто мэппируй файл по частям. Функция MapViewOfFile позволяет это делать.

Добавлено через 1 минуту
Кстати, какая функция возвращает ошибку?
vodilawofer
29 / 27 / 2
Регистрация: 27.09.2012
Сообщений: 123
20.08.2013, 20:23  [ТС]     Символ новой строки #89
Цитата Сообщение от castaway Посмотреть сообщение
Хотя нет, вру, там немного другое было. В общем не суть. Если не хватает ОЗУ - просто мэппируй файл по частям. Функция MapViewOfFile позволяет это делать.

Добавлено через 1 минуту
Кстати, какая функция возвращает ошибку?
ф-ция:GetLastError()

по частям это, наверно, трудоемко
castaway
Эксперт С++
4842 / 2981 / 367
Регистрация: 10.11.2010
Сообщений: 11,013
Записей в блоге: 10
Завершенные тесты: 1
20.08.2013, 20:25     Символ новой строки #90
Цитата Сообщение от vodilawofer Посмотреть сообщение
ф-ция:GetLastError()
Перед GetLastError еще какая-то функция возвращает ошибку?

Цитата Сообщение от vodilawofer Посмотреть сообщение
по частям это, наверно, трудоемко
Да, код надо будет переработать, но других выходов из ситуации я не вижу.
vodilawofer
29 / 27 / 2
Регистрация: 27.09.2012
Сообщений: 123
20.08.2013, 20:27  [ТС]     Символ новой строки #91
Цитата Сообщение от castaway Посмотреть сообщение
Перед GetLastError еще какая-то функция возвращает ошибку?

Да, код надо будет переработать, но других выходов из ситуации я не вижу.
C++
1
2
3
4
5
6
7
8
9
10
11
12
pvFileSrc = (char *)MapViewOfFile(fileMap, FILE_MAP_WRITE, 0, 0, fileSize);
    
    CloseHandle(fileMap);
 
    ptrStrEnd = pvFileSrc + fileSize;
    
    if(!pvFileSrc)
    {
        printf("ERROR mapping file");
        [B]printf("%d", GetLastError());[/B]
        return 1;
    }
в принципе, нет.
castaway
Эксперт С++
4842 / 2981 / 367
Регистрация: 10.11.2010
Сообщений: 11,013
Записей в блоге: 10
Завершенные тесты: 1
20.08.2013, 20:34     Символ новой строки #92
Цитата Сообщение от vodilawofer Посмотреть сообщение
в принципе, нет.
Во-первых, MapViewOfFile возвращает 0. Что говорит об ошибке вызова этой функции. Что я и хотел узнать.
Во-вторых, я бы не был так уверен что хэндл файла можно закрыть сразу после мэппирования, в документации не сказано что так можно делать.
vodilawofer
29 / 27 / 2
Регистрация: 27.09.2012
Сообщений: 123
20.08.2013, 20:35  [ТС]     Символ новой строки #93
"Во-вторых, я бы не был так уверен что хэндл файла можно закрыть сразу после мэппирования, в документации не сказано что так можно делать."
у меня с этим проблем не было.
castaway
Эксперт С++
4842 / 2981 / 367
Регистрация: 10.11.2010
Сообщений: 11,013
Записей в блоге: 10
Завершенные тесты: 1
20.08.2013, 20:39     Символ новой строки #94
Цитата Сообщение от vodilawofer Посмотреть сообщение
у меня с этим проблем не было.
Далеко не факт что не будет в дальнейшем или на разных версиях ОС.

Не по теме:

Смысл моих советов теряется если ты к ним не прислушиваешься.

vodilawofer
29 / 27 / 2
Регистрация: 27.09.2012
Сообщений: 123
20.08.2013, 20:49  [ТС]     Символ новой строки #95
у меня 2 handle от createfile и от MapViewOfFile их оба закрывать по окончанию работы программы?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.08.2013, 20:55     Символ новой строки
Еще ссылки по теме:

Вывести строки, в которых символ «*» встречается не менее 2 раз и заменить символ «*» на символ «_» C++
Std::cin, символ новой строки C++
C++ Будет ли добавлен символ новой строки при ошибочном вводе?

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

Или воспользуйтесь поиском по форуму:
castaway
Эксперт С++
4842 / 2981 / 367
Регистрация: 10.11.2010
Сообщений: 11,013
Записей в блоге: 10
Завершенные тесты: 1
20.08.2013, 20:55     Символ новой строки #96
Закрывай их когда захочешь, только в обратном порядке: UnmapViewOfFile( pvFileSrc ), CloseHandle( fileMap ), CloseHandle( file ).
Yandex
Объявления
20.08.2013, 20:55     Символ новой строки
Ответ Создать тему
Опции темы

Текущее время: 11:40. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru