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

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

16.08.2013, 18:16. Показов 7771. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Море в объективе
kumehtar 06.07.2026
Хотел написать много проникновенных слов, но передумал. Оно само - говорит. Кто слышит тот слышит.
Оказывается, Unreal Engine позволяет качество на порядки выше, чем было в Lineedge
Etyuhibosecyu 05.07.2026
Жаль, конечно, что я не узнал об этом, пока Lineedge существовала, а то бы Noname2331 написал, что волки превращаются в пиксельную кашу, а я бы его попросил скачать какую-нибудь бриллиантовую или Pro. . .
Doom для терминала без стрельбы и монстров. 3D Raycasting на ascii.
dcc0 05.07.2026
Попросил нейронную сеть deepai. org написать рейкастинг 3D с библиотекой ncurses для Linux. Чтобы можно было ходить на стрелочки. Чтобы стены были отрисованы символами. Справилась. Первый вариант. . .
Установка статуса документа по условию
Maks 05.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "НарядПутевка" разработанного в КА2. Задача: в табличной части "Материалы" документа при записи автоматически устанавливать статус. . .
Сезонность и суточность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет. Но обычно это 50 лет и более. Наверное, закисление почвы происходит сезонно в средней. . .
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи. Через несколько переработок от PHP кода к C89 (надеюсь, 89). Но довольно запутанно получилось. Код для Linux. Но если убрать time и то, что с ним. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru