Форум программистов, компьютерный форум 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++ Как убрать символ новой строки, применяя перегруженный оператор <<?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
16.08.2013, 18:48     Символ новой строки #2
Цитата Сообщение от vodilawofer Посмотреть сообщение
Пожалуйста, подскажите как определить строку.
Где определить? В том, что находится по указателю pvFileSrc?

C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
#include <string>
#include <sstream>
 
using namespace std;
...
stringstream s(pvFileSrc);
string str;
while (getline(s, str))
{
    cout << str << endl;
}
vodilawofer
29 / 27 / 2
Регистрация: 27.09.2012
Сообщений: 123
16.08.2013, 19:03  [ТС]     Символ новой строки #3
Цитата Сообщение от alsav22 Посмотреть сообщение
Где определить? В том, что находится по указателю pvFileSrc?

C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
#include <string>
#include <sstream>
 
using namespace std;
...
stringstream s(pvFileSrc);
string str;
while (getline(s, str))
{
    cout << str << endl;
}
while (getline(s, str)) - на этом месте ругается getline
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
16.08.2013, 19:09     Символ новой строки #4
Цитата Сообщение от vodilawofer Посмотреть сообщение
while (getline(s, str)) - на этом месте ругается getline
getline() ругаться не умеет, компилятор может. Инклуды сделали?
vodilawofer
29 / 27 / 2
Регистрация: 27.09.2012
Сообщений: 123
16.08.2013, 19:09  [ТС]     Символ новой строки #5
Цитата Сообщение от alsav22 Посмотреть сообщение
Инклуды сделали?
да.
castaway
Эксперт С++
4844 / 2983 / 367
Регистрация: 10.11.2010
Сообщений: 11,017
Записей в блоге: 10
Завершенные тесты: 1
16.08.2013, 19:12     Символ новой строки #6
Выводится как надо. Каждое слово на новой строке.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <windows.h>
#include <cstdio>
 
int main( int argc, char *argv[] )
{
    HANDLE file = CreateFile( "test.txt", 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 );
 
    printf( "%s\n", pvFileSrc );
 
    UnmapViewOfFile( pvFileSrc );
    CloseHandle( fileMap );
    CloseHandle( file );
    return 0;
}
Файл test.txt :
cyber
forum
Добавлено через 1 минуту
Цитата Сообщение от vodilawofer Посмотреть сообщение
если в файле строки находятся на разных строках
Выложи сюда пример файла в виде файла.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
16.08.2013, 19:12     Символ новой строки #7
Цитата Сообщение от vodilawofer Посмотреть сообщение
да.
Чудес в программировании не бывает. Код покажите.
vodilawofer
29 / 27 / 2
Регистрация: 27.09.2012
Сообщений: 123
16.08.2013, 19:19  [ТС]     Символ новой строки #8
Цитата Сообщение от alsav22 Посмотреть сообщение
Чудес в программировании не бывает. Код покажите.
у меня какие то проблемы. в другом проекте ок. и выводиться ок. Спасибо!

Добавлено через 1 минуту
Вопрос такой. с помощью strstr я получал адрес новой строки. Здесь как можно это получить?

Добавлено через 1 минуту
Цитата Сообщение от castaway Посмотреть сообщение
Выводится как надо. Каждое слово на новой строке.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <windows.h>
#include <cstdio>
 
int main( int argc, char *argv[] )
{
    HANDLE file = CreateFile( "test.txt", 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 );
 
    printf( "%s\n", pvFileSrc );
 
    UnmapViewOfFile( pvFileSrc );
    CloseHandle( fileMap );
    CloseHandle( file );
    return 0;
}
Файл test.txt :

Добавлено через 1 минуту
Выложи сюда пример файла в виде файла.
выводится у меня так тоже норм. а вот strstr не находит новую строку(
castaway
Эксперт С++
4844 / 2983 / 367
Регистрация: 10.11.2010
Сообщений: 11,017
Записей в блоге: 10
Завершенные тесты: 1
16.08.2013, 19:19     Символ новой строки #9
Цитата Сообщение от vodilawofer Посмотреть сообщение
а вот strstr не находит новую строку(
И не найдет пока не покажешь как ты это делаешь.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
16.08.2013, 19:20     Символ новой строки #10
Цитата Сообщение от vodilawofer Посмотреть сообщение
Вопрос такой. с помощью strstr я получал адрес новой строки.
Что хотите сделать? Для чего адрес?
vodilawofer
29 / 27 / 2
Регистрация: 27.09.2012
Сообщений: 123
16.08.2013, 19:24  [ТС]     Символ новой строки #11
Делаю вот так:
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
string fileName = "test.txt";
    wchar_t fileNameWChar[100];
    
    for (int i = 0; i < fileName.size(); ++i)
    {
        fileNameWChar[i] = (wchar_t)fileName.at(i);
    }
    fileNameWChar[fileName.size()] = '\0';
    
    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);
    if (!file) 
    { 
 
        std::cout << "I can't open file!";
        
        exit(0);
 
    }
 
    CloseHandle(file);
    
    char *FileSrc = (char *)MapViewOfFile(fileMap, FILE_MAP_WRITE, 0, 0, fileSize);
    
    char *s1 = strstr(FileSrc, "\n");
только что проверил, в другом проекте strstr норм отработал(

Мне нужно в файле поменять местами 2 строки.
castaway
Эксперт С++
4844 / 2983 / 367
Регистрация: 10.11.2010
Сообщений: 11,017
Записей в блоге: 10
Завершенные тесты: 1
16.08.2013, 19:27     Символ новой строки #12
Что ты ожидаешь получить в результате выполнения функции strstr ?
vodilawofer
29 / 27 / 2
Регистрация: 27.09.2012
Сообщений: 123
16.08.2013, 19:28  [ТС]     Символ новой строки #13
Цитата Сообщение от castaway Посмотреть сообщение
Что ты ожидаешь получить в результате выполнения функции strstr ?
указатель на новую строку.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
16.08.2013, 19:30     Символ новой строки #14
Цитата Сообщение от vodilawofer Посмотреть сообщение
Мне нужно в файле поменять местами 2 строки.
Файл переписывать нужно будет. А обязательно тут HANDLE и прочие CreateFile() использовать? Всё это проще делается. Или так нужно?
castaway
Эксперт С++
4844 / 2983 / 367
Регистрация: 10.11.2010
Сообщений: 11,017
Записей в блоге: 10
Завершенные тесты: 1
16.08.2013, 19:31     Символ новой строки #15
Цитата Сообщение от vodilawofer Посмотреть сообщение
указатель на новую строку.
Все верно. У меня прекрасно работает.
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <windows.h>
#include <cstdio>
 
int main( int argc, char *argv[] )
{
    HANDLE file = CreateFile( "test.txt", 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 );
 
    char *s1 = strstr(pvFileSrc, "\n" );
    printf( "%s\n", s1 );
 
    UnmapViewOfFile( pvFileSrc );
    CloseHandle( fileMap );
    CloseHandle( file );
    return 0;
}
Вывод: forum

На самом деле, к чему эти ухищрения с MapViewOfFile ?
vodilawofer
29 / 27 / 2
Регистрация: 27.09.2012
Сообщений: 123
16.08.2013, 19:36  [ТС]     Символ новой строки #16
Цитата Сообщение от castaway Посмотреть сообщение
Все верно. У меня прекрасно работает.
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <windows.h>
#include <cstdio>
 
int main( int argc, char *argv[] )
{
    HANDLE file = CreateFile( "test.txt", 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 );
 
    char *s1 = strstr(pvFileSrc, "\n" );
    printf( "%s\n", s1 );
 
    UnmapViewOfFile( pvFileSrc );
    CloseHandle( fileMap );
    CloseHandle( file );
    return 0;
}
Вывод: forum
У меня тоже) но до этого не работало. Я уж решил другим методом сделать и сюда написать.

Добавлено через 3 минуты
"На самом деле, к чему эти ухищрения с MapViewOfFile ?"

файл большой 1 2 гига. и надо поменять местами 2 строки
castaway
Эксперт С++
4844 / 2983 / 367
Регистрация: 10.11.2010
Сообщений: 11,017
Записей в блоге: 10
Завершенные тесты: 1
16.08.2013, 19:37     Символ новой строки #17
Цитата Сообщение от vodilawofer Посмотреть сообщение
файл большой 1 2 гига. и надо поменять местами 2 строки
Это можно без труда сделать без использования MapViewOfFile.
vodilawofer
29 / 27 / 2
Регистрация: 27.09.2012
Сообщений: 123
16.08.2013, 19:39  [ТС]     Символ новой строки #18
Цитата Сообщение от castaway Посмотреть сообщение
Это можно без труда сделать без использования MapViewOfFile.
а как?
castaway
Эксперт С++
4844 / 2983 / 367
Регистрация: 10.11.2010
Сообщений: 11,017
Записей в блоге: 10
Завершенные тесты: 1
16.08.2013, 19:40     Символ новой строки #19
Хотя нет, не всегда. Тут я поспешил с ответом. Файл состоит только и текстовых строк? Есть ли какая дополнительная информация в файле?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.08.2013, 19:40     Символ новой строки
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
vodilawofer
29 / 27 / 2
Регистрация: 27.09.2012
Сообщений: 123
16.08.2013, 19:40  [ТС]     Символ новой строки #20
Цитата Сообщение от castaway Посмотреть сообщение
Хотя нет, не всегда. Тут я поспешил с ответом. Файл состоит только и текстовых строк?
думаю да. по поводу доп инфо, думаю ее не будет
Yandex
Объявления
16.08.2013, 19:40     Символ новой строки
Ответ Создать тему
Опции темы

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