Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/25: Рейтинг темы: голосов - 25, средняя оценка - 4.60
 Аватар для meJevin
161 / 153 / 92
Регистрация: 18.11.2015
Сообщений: 677

Изменение строки из файла без перезаписи

16.06.2016, 05:17. Показов 4871. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет, пробую без перезаписи файла заменить все буквы строки на большие.

Пока что вышло только так:
Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
bool upper_line(std::fstream & inFile)
{
    auto start_of_line = inFile.tellg();
 
    std::string line{};
    if(!(std::getline(inFile, line)))
        return false;
 
    string_to_upper(line);
 
    auto next_line_start = inFile.tellg();
 
    inFile.seekg(start_of_line);
 
    for (auto it = line.begin(); it != line.end(); it++)
        inFile.put((*it));
 
    inFile.seekg(next_line_start);
 
    return true;
}


string_to_upper
Кликните здесь для просмотра всего текста

C++
1
2
3
4
void string_to_upper(std::string & str)
{
    std::for_each(str.begin(), str.end(), [](char & c) {c = toupper(c); });
}


Ну и вот так в main:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void main()
{
 
    std::fstream inFile;
 
 
    inFile.open("test.txt");
    if (!inFile || inFile.fail()) { std::cout << "fuck off" << std::endl; _getch(); return; }
 
    while(upper_line(inFile));
 
    inFile.close();
 
    std::cout << "u done nigga" << std::endl;
 
    _getch();
 
}


На миллион строк, состоящих из 5-25 символов, у меня ушла ~1 минута.

Можно ли это сделать как-то побыстрее? Ну, оптимизировать как-нибудь.

Спасибо
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
16.06.2016, 05:17
Ответы с готовыми решениями:

Как без перезаписи удалить строку из файла?
У мну задание такое есть именно удалить надо строку а не перезаписовать или копировать файл я вот сделал все ето с векторамы,записовал...

Создание (сохранение) файла без перезаписи с добавлением цифры к имени файла
Как реализовать в программе возможность сохранения файла без удаления старого(одноимённого файла) Например. Когда я вручную создаю...

Запись в файл данных, без перезаписи всего файла
Существует какой-то файл, в котором есть набор данных. Мне нужно изменить значение только в одном месте, как это сделать без перезаписи...

10
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
16.06.2016, 05:34
так зачем тут std::string, строки и т.д. Просто пока не конец - берёте символ проверяете его на InRange(ch, 'a', 'z') и если да то тут же +('a' - 'A' )
0
 Аватар для meJevin
161 / 153 / 92
Регистрация: 18.11.2015
Сообщений: 677
16.06.2016, 07:42  [ТС]
rikimaru2013, а можно немного подробнее, я ничего не понял

Добавлено через 2 минуты
rikimaru2013, я пытался сделать без std::string вообще, применяя toupper к каждому символу в тексте, но у меня ничего не вышло, я запутался. Вот мои последние наброски

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
bool upper_line(std::fstream & inFile) 
{
 
    do {
        auto a = inFile.tellg();
        char b = inFile.get();
 
        if (b == '\n') break;
 
        inFile.seekg(-1, std::ios::cur);
 
        inFile.put(toupper(b));
    } while (1);
 
    inFile.seekg(2, std::ios::cur);
 
    return true;
}
Добавлено через 2 минуты
Запоминаю позицию, с которой беру символ, потом двигаюсь обратно, заменяю toupper версией символа, который брал ранее, потом повторяю, пока не встречу новую линию. Но почему-то это не работает.

P.S. не смейтесь пожалуйста
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
16.06.2016, 08:06
C++
1
2
3
4
5
6
7
8
9
    while (true)
    {
        auto a = inFile.tellg();
        char b = inFile.get();
        if (!inFile) break;
 
        inFile.seekp(a);
        inFile.put(toupper(b));
    }
0
 Аватар для meJevin
161 / 153 / 92
Регистрация: 18.11.2015
Сообщений: 677
16.06.2016, 08:16  [ТС]
nmcf, тоже самое, что и было. Буква "E" бесконечно копируется почему-то
Миниатюры
Изменение строки из файла без перезаписи  
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
16.06.2016, 08:46
Лучший ответ Сообщение было отмечено meJevin как решение

Решение

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <fstream>
#include <iostream>
using namespace std;
 
void main()
{
    std::fstream inFile;
    inFile.open( "hello.txt", std::ios::out | std::ios::in );   
    while( !inFile.eof() )
    {           
        char ch = inFile.get();
        long pos = inFile.tellp();
 
        if( islower( ch ) )
        {
            inFile.seekp( pos - 1 );
            inFile.put( toupper( ch ) );
            inFile.seekp( pos );
        }       
    }
    inFile.close();
}
2
 Аватар для meJevin
161 / 153 / 92
Регистрация: 18.11.2015
Сообщений: 677
16.06.2016, 19:43  [ТС]
rikimaru2013, а-а-а-а, все, вижу, где налажал. Спасибо огромное, рики.

Я, правда, тестил через первый и вторые способы. Вышло, что первый намного быстрее, что меня удивило. Я думал, что с созданием временных перемененных std::string и всякими там манипуляциями быстродействие падает сильно. Но нет, первый способ перевел все буквы в большие в миллионе строк за 60-62 секунды, в то время, как второй способ перевел все буквы в большие в 460 тысячах строк за 80-85 секунд.

Но все равно, спасибо всем за помощь)
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
16.06.2016, 21:44
meJevin, что за первый и второй способ? Коды - замеры плиз - интересно же ж.
0
 Аватар для meJevin
161 / 153 / 92
Регистрация: 18.11.2015
Сообщений: 677
16.06.2016, 23:12  [ТС]
rikimaru2013

Первый код:
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
#include <string>
#include <iostream>
#include <conio.h>
#include <fstream>
#include <algorithm>
#include <ctime>
 
void string_to_upper(std::string & str)
{
    std::for_each(str.begin(), str.end(), [](char & c) {c = toupper(c); });
}
 
bool upper_line(std::fstream & inFile)
{
    auto start_of_line = inFile.tellg();
 
    std::string line{};
    if (!(std::getline(inFile, line)))
        return false;
 
    string_to_upper(line);
 
    auto next_line_start = inFile.tellg();
 
    inFile.seekg(start_of_line);
 
    for (auto it = line.begin(); it != line.end(); it++)
        inFile.put((*it));
 
    inFile.seekg(next_line_start);
 
    return true;
}
 
void main()
{
 
    std::fstream inFile;
 
    inFile.open("test.txt", std::ios::out | std::ios::in);
    if (!inFile || inFile.fail()) { /* ERROR */ }
 
    int start_s = clock();
 
    // Весь файл в большие буквы
    while(upper_line(inFile));
 
    inFile.close();
 
    int stop_s = clock();
    std::cout << "Time: " << (stop_s - start_s) / double(CLOCKS_PER_SEC) * 1000 << std::endl;
 
    _getch();
 
}
Второй код:
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
#include <iostream>
#include <conio.h>
#include <fstream>
#include <ctime>
 
bool upper_line(std::fstream & inFile)
{
    while (!inFile.eof())
    {
        char ch = inFile.get();
        long pos = inFile.tellp();
 
        if (islower(ch))
        {
            inFile.seekp(pos - 1);
            inFile.put(toupper(ch));
            inFile.seekp(pos);
        }
    }
 
    return true;
}
 
void main()
{
 
    std::fstream inFile;
 
    inFile.open("test.txt", std::ios::out | std::ios::in);
    if (!inFile || inFile.fail()) { /* ERROR */ }
 
    int start_s = clock();
 
    // Весь файл в большие буквы
    upper_line(inFile);
 
    inFile.close();
 
    int stop_s = clock();
    std::cout << "Time: " << (stop_s - start_s) / double(CLOCKS_PER_SEC) * 1000 << std::endl;
 
    _getch();
 
}
Миниатюры
Изменение строки из файла без перезаписи   Изменение строки из файла без перезаписи   Изменение строки из файла без перезаписи  

Изменение строки из файла без перезаписи   Изменение строки из файла без перезаписи  
0
 Аватар для meJevin
161 / 153 / 92
Регистрация: 18.11.2015
Сообщений: 677
16.06.2016, 23:16  [ТС]
~3.63 минуты вышло со вторым кодом, с первым кодом ~1.04

Добавлено через 2 минуты
Хмм, а встроенная функция notepad++ вообще эти миллион строк за секунды 2-3 переключает с маленьких букв на заглавные...
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
17.06.2016, 15:55
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
    const int sz = 10 * 1024 * 1024;
 
    char * buf = new char[sz];
 
    std::fstream inFile;
 
    inFile.open("test.txt", inFile.out | inFile.in | inFile.binary);
    if (!inFile) { /* ERROR */ }
 
    int start_s = clock();
 
    for (;;)
    {
        int cp = inFile.tellg();
        int gc = inFile.read(buf, sz).gcount();
        if (gc == 0) break;
        std::for_each(buf, buf + gc, [](char & c) { c = toupper(c); });
        inFile.clear();
        inFile.seekp(cp);
        inFile.write(buf, gc);
        inFile.seekg(cp + gc);
    }   
 
    inFile.close();
 
    int stop_s = clock();
    std::cout << "Time: " << (stop_s - start_s) / double(CLOCKS_PER_SEC) * 1000 << std::endl;
 
    delete[] buf;
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
17.06.2016, 15:55
Помогаю со студенческими работами здесь

Внесение изменений в XML без перезаписи всего файла
Такой вопрос есть приложение которое работает с данными в XML. Работает примерно таким образом : var x =...

Файлы C++. Запись в конец файла, без его перезаписи
Доброго времени суток, уважаемые форумчане! Изучаю работу с файлами в C++ с использованием fstream. Возник вопрос: как сделать так, чтобы...

Удаление одной записи из БД без перезаписи всего файла
Здравствуйте :) Наверное, по моему вопросу много информации в интернете, но я не знаю, как сформулировать его поисковику. Я...

Изменить конкретную строку в файле, без перезаписи полного файла
Возможно ли такое? Допустим, у меня есть текстовик. Скрипт на сайте если надо изменит одну строку в этом текстовике. Но если два юзера...

Sigplus for joomla 2.5 Редактирование файла labels без перезаписи на хостинг
Здравствуйте. Поставил на сайт галерею sigplus, в ней реализованы подписи под изображениями при помощи файла labels.txt т.е. без записи в...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Ниже машинный перевод статьи The Thinkpad X220 Tablet is the best budget school laptop period . Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы,. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru