Форум программистов, компьютерный форум 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++ Как убрать символ новой строки, применяя перегруженный оператор <<?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
castaway
Эксперт С++
4841 / 2980 / 367
Регистрация: 10.11.2010
Сообщений: 11,013
Записей в блоге: 10
Завершенные тесты: 1
16.08.2013, 19:41     Символ новой строки #21
Цитата Сообщение от vodilawofer Посмотреть сообщение
думаю да
Как это понимать? Ты не знаешь какие данные ты обрабатываешь?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
vodilawofer
29 / 27 / 2
Регистрация: 27.09.2012
Сообщений: 123
16.08.2013, 19:43  [ТС]     Символ новой строки #22
Цитата Сообщение от castaway Посмотреть сообщение
Как это понимать? Ты не знаешь какие данные ты обрабатываешь?
Я не знаю какие они будут. Не от меня зависит
castaway
Эксперт С++
4841 / 2980 / 367
Регистрация: 10.11.2010
Сообщений: 11,013
Записей в блоге: 10
Завершенные тесты: 1
16.08.2013, 19:47     Символ новой строки #23
Цитата Сообщение от vodilawofer Посмотреть сообщение
Я не знаю какие они будут. Не от меня зависит
Если файл может состоять не только из текстовых строк, тогда смысл темы теряется. Если конечно ты не подразумеваешь двоичные данные с переводом строки, хоть это и не логично...
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
16.08.2013, 19:49     Символ новой строки #24
Цитата Сообщение от vodilawofer Посмотреть сообщение
надо поменять местами 2 строки
Как именно выбираются эти строки? По счёту? По содержанию? Как-то по другому?
vodilawofer
29 / 27 / 2
Регистрация: 27.09.2012
Сообщений: 123
16.08.2013, 19:50  [ТС]     Символ новой строки #25
Цитата Сообщение от castaway Посмотреть сообщение
Если файл может состоять не только из текстовых строк, тогда смысл темы теряется. Если конечно ты не подразумеваешь двоичные данные с переводом строки, хоть это и не логично...
Давайте продолжим тему. Будем считать что файл состоит из текстовых строк.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
16.08.2013, 19:52     Символ новой строки #26
Самое простое, читать строки из файла в вектор, а там искать (если нужно что-то найти), переставлять и пр. Потом вектор записать в файл. И остаётся вопрос:
Цитата Сообщение от alsav22 Посмотреть сообщение
Как именно выбираются эти строки? По счёту? По содержанию? Как-то по другому?
castaway
Эксперт С++
4841 / 2980 / 367
Регистрация: 10.11.2010
Сообщений: 11,013
Записей в блоге: 10
Завершенные тесты: 1
16.08.2013, 19:53     Символ новой строки #27
Цитата Сообщение от vodilawofer Посмотреть сообщение
Давайте продолжим тему.
Давайте. Тогда мне тоже интересно:
Цитата Сообщение от alsav22 Посмотреть сообщение
Как именно выбираются эти строки?
Добавлено через 43 секунды
Цитата Сообщение от alsav22 Посмотреть сообщение
Самое простое, читать из файла в вектор
Ты шутишь? Он сказал файл ~2ГБ.
vodilawofer
29 / 27 / 2
Регистрация: 27.09.2012
Сообщений: 123
16.08.2013, 19:58  [ТС]     Символ новой строки #28
Вот как я хочу. находится 1 строка. есть два указателя на начало и конец строки. все это дело ищется через strstr.
1 строку буфферизируем. смещаем данные strcpy. находим 2 строку. ЕЕ тоже буфф. смещаем. и вставляем строки на место

Добавлено через 1 минуту
выбираются рандомно по номеру.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
16.08.2013, 19:59     Символ новой строки #29
Цитата Сообщение от vodilawofer Посмотреть сообщение
ЕЕ тоже буфф. смещаем. и вставляем.
Где это всё будет смещаться и вставляться? А если строки разной длины?
vodilawofer
29 / 27 / 2
Регистрация: 27.09.2012
Сообщений: 123
16.08.2013, 20:02  [ТС]     Символ новой строки #30
Цитата Сообщение от alsav22 Посмотреть сообщение
Где это всё будет смещаться и вставляться? А если строки разной длины?
в pvFileSrc. вот именно, изза разной длины строк я не могу использовать fseek, seekg и прочими фун-циями
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
16.08.2013, 20:02     Символ новой строки #31
Цитата Сообщение от vodilawofer Посмотреть сообщение
выбираются рандомно по номеру.
Находим в файле нужные строки, сохраняем. Переписывем строки в новый файл, при записи меняем строки. Старый файл удаляем.
vodilawofer
29 / 27 / 2
Регистрация: 27.09.2012
Сообщений: 123
16.08.2013, 20:06  [ТС]     Символ новой строки #32
Цитата Сообщение от alsav22 Посмотреть сообщение
Находим в файле нужные строки, сохраняем. Переписывем строки в новый файл, при записи меняем строки. Старый файл удаляем.
а по времени как? новый файл будет создавать долго?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
16.08.2013, 20:38     Символ новой строки #33
Цитата Сообщение от vodilawofer Посмотреть сообщение
а по времени как? новый файл будет создавать долго?
В старом можно переписывать, если строки будут строго одинаковой длины. Такая гарантия есть?
Примерно так можно сделать:
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
#include <iostream>
#include <string>
#include <fstream>
 
using namespace std;
 
int main()
{
    ifstream fin("file1.txt");
    if (!fin) cout << "Error!" << endl;
    else
    {
        string temp;
        while (getline(fin, temp))
            cout << temp << endl;
        cout << endl;
        
        fin.clear();
        fin.seekg(0);
        
        string str1, str2;
        int i = 0, n = 2, m = 7;
        while (getline(fin, temp))
        {
            ++i;
            if (i == n) str1 = temp;
            if (i == m) str2 = temp;
        }
        fin.clear();
        fin.seekg(0);
        i = 0;
 
        ofstream fout("file2.txt");
        
        while (getline(fin, temp))
        {
            ++i;
            if (i == n) fout << str2 << endl;
            else if (i == m) fout << str1 << endl;
                 else fout << temp << endl;
        }
        fout.close();
        fin.close();
        //fout.open("file1.txt");
 
        fin.open("file2.txt");
        while (getline(fin, temp))
            cout << temp << endl;
        cout << endl;
        
        fin.close();
    }
  
    system("pause");
    return 0;
}
Миниатюры
Символ новой строки  
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
16.08.2013, 20:39     Символ новой строки #34
Примерно так. Можно сделать всё быстрее.
castaway
Эксперт С++
4841 / 2980 / 367
Регистрация: 10.11.2010
Сообщений: 11,013
Записей в блоге: 10
Завершенные тесты: 1
16.08.2013, 20:49     Символ новой строки #35
Я тут подумал и сделал вывод:
Самая главная проблема в том, что если строки разных размеров то придется читать данные от начала первой строки до конца второй. Выделять то что находится между строками, сохранять это, менять строки местами, записывать первую строку, потом записывать то что находилось между ними, потом вторую. Размер данных при этом не меняется.
Здесь очень поможет MapViewOfFile, по-другому через MapViewOfFile только извращения.
vodilawofer
29 / 27 / 2
Регистрация: 27.09.2012
Сообщений: 123
16.08.2013, 20:54  [ТС]     Символ новой строки #36
гарантий нет. Большая вероятность того, что строки разных размеров.

Так с MapViewOfFile лучше делать?
castaway
Эксперт С++
4841 / 2980 / 367
Регистрация: 10.11.2010
Сообщений: 11,013
Записей в блоге: 10
Завершенные тесты: 1
16.08.2013, 20:54     Символ новой строки #37
Цитата Сообщение от vodilawofer Посмотреть сообщение
Так с MapViewOfFile лучше делать?
Если есть возможность, тогда да, делай с MapViewOfFile. Алгоритм понятен?
vodilawofer
29 / 27 / 2
Регистрация: 27.09.2012
Сообщений: 123
16.08.2013, 20:57  [ТС]     Символ новой строки #38
Цитата Сообщение от alsav22 Посмотреть сообщение
В старом можно переписывать, если строки будут строго одинаковой длины. Такая гарантия есть?
Примерно так можно сделать:
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
#include <iostream>
#include <string>
#include <fstream>
 
using namespace std;
 
int main()
{
    ifstream fin("file1.txt");
    if (!fin) cout << "Error!" << endl;
    else
    {
        string temp;
        while (getline(fin, temp))
            cout << temp << endl;
        cout << endl;
        
        fin.clear();
        fin.seekg(0);
        
        string str1, str2;
        int i = 0, n = 2, m = 7;
        while (getline(fin, temp))
        {
            ++i;
            if (i == n) str1 = temp;
            if (i == m) str2 = temp;
        }
        fin.clear();
        fin.seekg(0);
        i = 0;
 
        ofstream fout("file2.txt");
        
        while (getline(fin, temp))
        {
            ++i;
            if (i == n) fout << str2 << endl;
            else if (i == m) fout << str1 << endl;
                 else fout << temp << endl;
        }
        fout.close();
        fin.close();
        //fout.open("file1.txt");
 
        fin.open("file2.txt");
        while (getline(fin, temp))
            cout << temp << endl;
        cout << endl;
        
        fin.close();
    }
  
    system("pause");
    return 0;
}
я эксперементировал, смотрел как будет добавление в строку происходить. если ставил r+ то затирал символы. если а+ то в конец только добавлял

Добавлено через 1 минуту
Цитата Сообщение от castaway Посмотреть сообщение
Если есть возможность, тогда да, делай с MapViewOfFile. Алгоритм понятен?
да понятен более -менее.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
16.08.2013, 21:54     Символ новой строки #39
Цитата Сообщение от vodilawofer Посмотреть сообщение
я эксперементировал, смотрел как будет добавление в строку происходить. если ставил r+ то затирал символы. если а+ то в конец только добавлял
Это о чём? Кто что затирает?

Вот так быстрее будет:
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
#include <iostream>
#include <string>
#include <fstream>
 
using namespace std;
 
int main()
{
    ifstream fin("file1.txt");
    if (!fin) cout << "Error!" << endl;
    else
    {
        string temp;
        while (getline(fin, temp))
            cout << temp << endl;
        cout << endl;
        
        fin.clear();
        fin.seekg(0);
        
        string str1, str2;
        int i = 1;
        int n = 1, m = 10; // номера заменяемых строк
        while (true) 
        {
            if (i == n) 
            {
                getline(fin, str1);
                ++i;
            }
            if (i == m) 
            {
                getline(fin, str2);
                ++i;
            }
            fin.ignore(255, '\n'); // предполагается, что длина строки не более 255 символов
            if (fin.eof()) break;
            ++i;
        }
        fin.clear();
        fin.seekg(0);
        
        if (str1.empty() || str2.empty()) // если какая-либо строка не считана (нет такого номера)
        {
            cout << "Strings not found!" << endl;
            cout << "The file contains " << i - 1 << " strings" << endl;
            system("pause");
            return 0;
        }
        
        i = 1;
        char ch;
        ofstream fout("file2.txt");
        while (true)
        {
            if (i == n) 
            {
                fout << str2 << endl;
                fin.ignore(255, '\n');
                ++i;
            }
            else if (i == m) 
                 {
                     fout << str1 << endl;
                     fin.ignore(255, '\n');
                     ++i;
                 }
            
            fin.get(ch);
            if (fin.eof()) break;
            fout.put(ch);
            
            if (ch == '\n') ++i;
        }
        
        fout.close();
        fin.close();
        //fout.open("file1.txt"); // стирается старый файл
 
        fin.open("file2.txt");
        while (getline(fin, temp))
            cout << temp << endl;
        cout << endl;
        
        fin.close();
    }
  
    system("pause");
    return 0;
}
Миниатюры
Символ новой строки  
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.08.2013, 22:03     Символ новой строки
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
vodilawofer
29 / 27 / 2
Регистрация: 27.09.2012
Сообщений: 123
16.08.2013, 22:03  [ТС]     Символ новой строки #40
Цитата Сообщение от castaway Посмотреть сообщение
Я тут подумал и сделал вывод:
Самая главная проблема в том, что если строки разных размеров то придется читать данные от начала первой строки до конца второй. Выделять то что находится между строками, сохранять это, менять строки местами, записывать первую строку, потом записывать то что находилось между ними, потом вторую. Размер данных при этом не меняется.
Здесь очень поможет MapViewOfFile, по-другому через MapViewOfFile только извращения.
strcat не туда вставляет.
походу в pvFileSrc надо будет посимвольно записовать?
Yandex
Объявления
16.08.2013, 22:03     Символ новой строки
Ответ Создать тему
Опции темы

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