Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 24, средняя оценка - 5.00
vodilawofer
29 / 27 / 2
Регистрация: 27.09.2012
Сообщений: 123
#1

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

16.08.2013, 18:16. Просмотров 3281. Ответов 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
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.08.2013, 18:16
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Символ новой строки (C++):

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

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

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

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

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

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
alsav22
5419 / 4815 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
16.08.2013, 20:02 #31
Цитата Сообщение от vodilawofer Посмотреть сообщение
выбираются рандомно по номеру.
Находим в файле нужные строки, сохраняем. Переписывем строки в новый файл, при записи меняем строки. Старый файл удаляем.
1
vodilawofer
29 / 27 / 2
Регистрация: 27.09.2012
Сообщений: 123
16.08.2013, 20:06  [ТС] #32
Цитата Сообщение от alsav22 Посмотреть сообщение
Находим в файле нужные строки, сохраняем. Переписывем строки в новый файл, при записи меняем строки. Старый файл удаляем.
а по времени как? новый файл будет создавать долго?
0
alsav22
5419 / 4815 / 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;
}
1
Миниатюры
Символ новой строки  
alsav22
5419 / 4815 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
16.08.2013, 20:39 #34
Примерно так. Можно сделать всё быстрее.
0
castaway
Эксперт С++
4884 / 3020 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
16.08.2013, 20:49 #35
Я тут подумал и сделал вывод:
Самая главная проблема в том, что если строки разных размеров то придется читать данные от начала первой строки до конца второй. Выделять то что находится между строками, сохранять это, менять строки местами, записывать первую строку, потом записывать то что находилось между ними, потом вторую. Размер данных при этом не меняется.
Здесь очень поможет MapViewOfFile, по-другому через MapViewOfFile только извращения.
1
vodilawofer
29 / 27 / 2
Регистрация: 27.09.2012
Сообщений: 123
16.08.2013, 20:54  [ТС] #36
гарантий нет. Большая вероятность того, что строки разных размеров.

Так с MapViewOfFile лучше делать?
0
castaway
Эксперт С++
4884 / 3020 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
16.08.2013, 20:54 #37
Цитата Сообщение от vodilawofer Посмотреть сообщение
Так с MapViewOfFile лучше делать?
Если есть возможность, тогда да, делай с MapViewOfFile. Алгоритм понятен?
1
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. Алгоритм понятен?
да понятен более -менее.
0
alsav22
5419 / 4815 / 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;
}
1
Миниатюры
Символ новой строки  
vodilawofer
29 / 27 / 2
Регистрация: 27.09.2012
Сообщений: 123
16.08.2013, 22:03  [ТС] #40
Цитата Сообщение от castaway Посмотреть сообщение
Я тут подумал и сделал вывод:
Самая главная проблема в том, что если строки разных размеров то придется читать данные от начала первой строки до конца второй. Выделять то что находится между строками, сохранять это, менять строки местами, записывать первую строку, потом записывать то что находилось между ними, потом вторую. Размер данных при этом не меняется.
Здесь очень поможет MapViewOfFile, по-другому через MapViewOfFile только извращения.
strcat не туда вставляет.
походу в pvFileSrc надо будет посимвольно записовать?
0
castaway
Эксперт С++
4884 / 3020 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
16.08.2013, 22:06 #41
strcat тут не подойдет. Скорее подойдет strncpy.
0
vodilawofer
29 / 27 / 2
Регистрация: 27.09.2012
Сообщений: 123
16.08.2013, 22:09  [ТС] #42
Цитата Сообщение от castaway Посмотреть сообщение
strcat тут не подойдет. Скорее подойдет strncpy.
вылетает прога. но пробовать буду

Добавлено через 1 минуту
Цитата Сообщение от 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;
}
вставляешь строку в файл он либо затирал символы(эффект, если нажать insert и писать). либо вставлял в конец
0
alsav22
5419 / 4815 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
16.08.2013, 22:14 #43
Цитата Сообщение от vodilawofer Посмотреть сообщение
вставляешь строку в файл он либо затирал символы(эффект, если нажать insert и писать). либо вставлял в конец
Мой код? А как же скрины? Где там что затёрто? Покажите как вставляете. И почему вставляете? Насколько я понял, задача - поменять местами строки в файле?
0
castaway
Эксперт С++
4884 / 3020 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
16.08.2013, 22:18 #44
vodilawofer, мой тебе совет: если возникают проблемы с тем что тебе посоветовали, и ты не можешь их решить, выкладывай код и прикрепляй к нему скриншот с показанием проблемы/логи с ошибками - помощь от форумчан последует намного быстрее.
0
vodilawofer
29 / 27 / 2
Регистрация: 27.09.2012
Сообщений: 123
16.08.2013, 22:22  [ТС] #45
изза разности длин строк нужно будет двигать часть, которая находиться между ними, в ту или иную сторону.

Добавлено через 2 минуты
Цитата Сообщение от alsav22 Посмотреть сообщение
Мой код? А как же скрины? Где там что затёрто? Покажите как вставляете. И почему вставляете? Насколько я понял, задача - поменять местами строки в файле?
там было написано что я экспериментировал, сам до того как создать тему. alsav22,Ваш пример очень понравился. С виду простой.
Я его позже посмотрю. Большое спасибо
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.08.2013, 22:22
Привет! Вот еще темы с ответами:

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

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

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

Каждый символ строки заменить на следующий за ним, а последний символ строки заменяеть первым - C++
я написал код но не могу разобраться. вот дано : ---------------------------------------------------------- В текстовом файле fin.txt...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
16.08.2013, 22:22
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru