Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.56/32: Рейтинг темы: голосов - 32, средняя оценка - 4.56
29 / 27 / 1
Регистрация: 27.09.2012
Сообщений: 123
1

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

16.08.2013, 18:16. Показов 5995. Ответов 95
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем привет) С маппировал текстовый файл в память.
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"), ничего не выходит((

Пожалуйста, подскажите как определить строку.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.08.2013, 18:16
Ответы с готовыми решениями:

Символ новой строки в MFC
При работе в MFC нужно вести протокол работы, то есть, сделали операцию a + b = c, записали в окно...

Std::cin, символ новой строки
Подскажите, куда в данном примере после каждого cin'а девается символ новой строки? Насколько помню...

Зачем здесь символ новой строки?
Стивен Прата, Язык программирования С++, глава 7, пример 7 Никак не пойму, зачем здесь double...

Ошибка: символ новой строки в потоке
После того как указываю 1 пункт (к-ство квартир),то мне выбивает сразу 2 и 3,а не...

95
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
16.08.2013, 19:41 21
Author24 — интернет-сервис помощи студентам
Цитата Сообщение от vodilawofer Посмотреть сообщение
думаю да
Как это понимать? Ты не знаешь какие данные ты обрабатываешь?
0
29 / 27 / 1
Регистрация: 27.09.2012
Сообщений: 123
16.08.2013, 19:43  [ТС] 22
Цитата Сообщение от castaway Посмотреть сообщение
Как это понимать? Ты не знаешь какие данные ты обрабатываешь?
Я не знаю какие они будут. Не от меня зависит
0
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
16.08.2013, 19:47 23
Цитата Сообщение от vodilawofer Посмотреть сообщение
Я не знаю какие они будут. Не от меня зависит
Если файл может состоять не только из текстовых строк, тогда смысл темы теряется. Если конечно ты не подразумеваешь двоичные данные с переводом строки, хоть это и не логично...
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
16.08.2013, 19:49 24
Цитата Сообщение от vodilawofer Посмотреть сообщение
надо поменять местами 2 строки
Как именно выбираются эти строки? По счёту? По содержанию? Как-то по другому?
0
29 / 27 / 1
Регистрация: 27.09.2012
Сообщений: 123
16.08.2013, 19:50  [ТС] 25
Цитата Сообщение от castaway Посмотреть сообщение
Если файл может состоять не только из текстовых строк, тогда смысл темы теряется. Если конечно ты не подразумеваешь двоичные данные с переводом строки, хоть это и не логично...
Давайте продолжим тему. Будем считать что файл состоит из текстовых строк.
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
16.08.2013, 19:52 26
Самое простое, читать строки из файла в вектор, а там искать (если нужно что-то найти), переставлять и пр. Потом вектор записать в файл. И остаётся вопрос:
Цитата Сообщение от alsav22 Посмотреть сообщение
Как именно выбираются эти строки? По счёту? По содержанию? Как-то по другому?
1
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
16.08.2013, 19:53 27
Цитата Сообщение от vodilawofer Посмотреть сообщение
Давайте продолжим тему.
Давайте. Тогда мне тоже интересно:
Цитата Сообщение от alsav22 Посмотреть сообщение
Как именно выбираются эти строки?
Добавлено через 43 секунды
Цитата Сообщение от alsav22 Посмотреть сообщение
Самое простое, читать из файла в вектор
Ты шутишь? Он сказал файл ~2ГБ.
0
29 / 27 / 1
Регистрация: 27.09.2012
Сообщений: 123
16.08.2013, 19:58  [ТС] 28
Вот как я хочу. находится 1 строка. есть два указателя на начало и конец строки. все это дело ищется через strstr.
1 строку буфферизируем. смещаем данные strcpy. находим 2 строку. ЕЕ тоже буфф. смещаем. и вставляем строки на место

Добавлено через 1 минуту
выбираются рандомно по номеру.
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
16.08.2013, 19:59 29
Цитата Сообщение от vodilawofer Посмотреть сообщение
ЕЕ тоже буфф. смещаем. и вставляем.
Где это всё будет смещаться и вставляться? А если строки разной длины?
0
29 / 27 / 1
Регистрация: 27.09.2012
Сообщений: 123
16.08.2013, 20:02  [ТС] 30
Цитата Сообщение от alsav22 Посмотреть сообщение
Где это всё будет смещаться и вставляться? А если строки разной длины?
в pvFileSrc. вот именно, изза разной длины строк я не могу использовать fseek, seekg и прочими фун-циями
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
16.08.2013, 20:02 31
Цитата Сообщение от vodilawofer Посмотреть сообщение
выбираются рандомно по номеру.
Находим в файле нужные строки, сохраняем. Переписывем строки в новый файл, при записи меняем строки. Старый файл удаляем.
1
29 / 27 / 1
Регистрация: 27.09.2012
Сообщений: 123
16.08.2013, 20:06  [ТС] 32
Цитата Сообщение от alsav22 Посмотреть сообщение
Находим в файле нужные строки, сохраняем. Переписывем строки в новый файл, при записи меняем строки. Старый файл удаляем.
а по времени как? новый файл будет создавать долго?
0
5498 / 4893 / 831
Регистрация: 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;
}
Миниатюры
Символ новой строки  
1
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
16.08.2013, 20:39 34
Примерно так. Можно сделать всё быстрее.
0
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
16.08.2013, 20:49 35
Я тут подумал и сделал вывод:
Самая главная проблема в том, что если строки разных размеров то придется читать данные от начала первой строки до конца второй. Выделять то что находится между строками, сохранять это, менять строки местами, записывать первую строку, потом записывать то что находилось между ними, потом вторую. Размер данных при этом не меняется.
Здесь очень поможет MapViewOfFile, по-другому через MapViewOfFile только извращения.
1
29 / 27 / 1
Регистрация: 27.09.2012
Сообщений: 123
16.08.2013, 20:54  [ТС] 36
гарантий нет. Большая вероятность того, что строки разных размеров.

Так с MapViewOfFile лучше делать?
0
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
16.08.2013, 20:54 37
Цитата Сообщение от vodilawofer Посмотреть сообщение
Так с MapViewOfFile лучше делать?
Если есть возможность, тогда да, делай с MapViewOfFile. Алгоритм понятен?
1
29 / 27 / 1
Регистрация: 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. Алгоритм понятен?
да понятен более -менее.
0
5498 / 4893 / 831
Регистрация: 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;
}
Миниатюры
Символ новой строки  
1
29 / 27 / 1
Регистрация: 27.09.2012
Сообщений: 123
16.08.2013, 22:03  [ТС] 40
Цитата Сообщение от castaway Посмотреть сообщение
Я тут подумал и сделал вывод:
Самая главная проблема в том, что если строки разных размеров то придется читать данные от начала первой строки до конца второй. Выделять то что находится между строками, сохранять это, менять строки местами, записывать первую строку, потом записывать то что находилось между ними, потом вторую. Размер данных при этом не меняется.
Здесь очень поможет MapViewOfFile, по-другому через MapViewOfFile только извращения.
strcat не туда вставляет.
походу в pvFileSrc надо будет посимвольно записовать?
0
16.08.2013, 22:03
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.08.2013, 22:03
Помогаю со студенческими работами здесь

Отбрасывает ли std::cin символ новой строки?
Здравствуйте. Есть следующий код (это задача из книги Праты): #include &lt;iostream&gt; const...

Как убрать символ новой строки, применяя перегруженный оператор <<?
Друзья! Ну то есть формируются строки хитрым способом (не вручную, лучше не углубляться в это) ...

Будет ли добавлен символ новой строки при ошибочном вводе?
После того, как пользователь введет число и нажмеn enter в поток будет передан символ новой строки...

Ввести символьную строку. Распечатать каждый символ массива с новой строки
Ввести символьную строку. Распечатать каждый символ массива с новой строки.

Функция getline считывает несколько строк из файла, игнорируя символ новой строки
Всем доброго дня! В С++ я новичок, сам себе придумываю задачки, просто для тренировки....

Вывести строки, в которых символ «*» встречается не менее 2 раз и заменить символ «*» на символ «_»
День добрый. Имеется условие лабы. Написать программу, в которой с клавиатуры вводится до 10...


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

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