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

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

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

Студворк — интернет-сервис помощи студентам
Всем привет) С маппировал текстовый файл в память.
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
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
16.08.2013, 18:16
Ответы с готовыми решениями:

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

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

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

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

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

Так с MapViewOfFile лучше делать?
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
16.08.2013, 20:54
Цитата Сообщение от vodilawofer Посмотреть сообщение
Так с MapViewOfFile лучше делать?
Если есть возможность, тогда да, делай с MapViewOfFile. Алгоритм понятен?
1
29 / 27 / 1
Регистрация: 27.09.2012
Сообщений: 123
16.08.2013, 20:57  [ТС]
Цитата Сообщение от 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
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
16.08.2013, 21:54
Цитата Сообщение от 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  [ТС]
Цитата Сообщение от castaway Посмотреть сообщение
Я тут подумал и сделал вывод:
Самая главная проблема в том, что если строки разных размеров то придется читать данные от начала первой строки до конца второй. Выделять то что находится между строками, сохранять это, менять строки местами, записывать первую строку, потом записывать то что находилось между ними, потом вторую. Размер данных при этом не меняется.
Здесь очень поможет MapViewOfFile, по-другому через MapViewOfFile только извращения.
strcat не туда вставляет.
походу в pvFileSrc надо будет посимвольно записовать?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
16.08.2013, 22:03

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Транслитерация текста с кириллицы на латиницу (вариант №2)
Maks 13.11.2026
Обновленная версия ранее созданной обработки. Добавлено: - Проверка исходного текста на кириллицу, через обращение к стандартной функции "ТолькоКириллицаВСтроке" из общего модуля. . .
Часы с термометром и праздничным календарем
yariko 12.11.2026
Сегодня мы рассмотрим как можно сделать отличные многофункциональные часы. Итак, поставим конкретную задачу: разработать часы с календарем, двумя термодатчиками, выводом поздравительных сообщений. . .
Транслитерация текста с кириллицы на латиницу (вариант №1)
Maks 11.11.2026
Решил облегчить жизнь себе и коллегам админам при создании электронных почтовых ящиков для пользователей, в результате написал обработку "Транслитерация текста" с кириллицы на латиницу, а в ней. . .
Книги по геймдизайну, левел-дизайну, игровым механикам и проектированию игрового опыта
8Observer8 08.11.2026
Содержание блога | English Version 1. 2003 - 06 - Designing Virtual Worlds (1st Edition) Автор: Richard A. Bartle | Объем: 768 стр. Ссылки: Amazon . . .
Родители токсичные абьюзеры по отношению к своим детям ругают их оскорбляют не любят
zorxor 08.11.2026
Жить в атмосфере постоянных оскорблений, критики и холодности со стороны родителей — это тяжелое и болезненное испытание, которое оставляет глубокие эмоциональные раны. Токсичное и абьюзивное. . .
Как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Ответ от Джемени ИИ.
zorxor 08.11.2026
Джемени, как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Многие люди, возвращаясь домой, сразу переодеваются в максимально свободную одежду или вовсе предпочитают. . .
Паттерн очереди действий/команд (Action / Command Queue). Система очереди действий и кат-сцен с SDL3 Callbacks, cglm и OpenGL
8Observer8 07.11.2026
Содержание блога | English Version Руководство для начинающих по реализации паттерна очереди действий/ команд (Action / Command Queue) на C++ (C++20) с использованием официального SDL3 Callbacks. . .
Проверка полного ФИО в типовом справочнике
Maks 07.11.2026
Решение реализовано в конфигурации КА2, на примере справочника "КонтактныеЛицаПартнеров". Задача: Запрет инициалов. Не допускаеть использование сокращений вида "И. И. ", "И. И. ", "И И" и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru