Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
Danij
0 / 0 / 0
Регистрация: 17.12.2016
Сообщений: 41
1

Ввод данных с клавиатуры

18.12.2016, 21:59. Просмотров 1062. Ответов 21
Метки нет (Все метки)

Есть программа, которая меняет в нужном мне файле одно число на другое (не совсем мною написанная, тут же помогали на форуме, спасибо). Но появилась потребность в вводе числа, на которое меняется первое с клавиатуры. Т.е. открывается консоль (до оконного варианта мне с моими знаниями как до Китая раком), и просит ввести число. Число вводится, нажимается например Enter, и программа меняет первое значение на введенное. Желательно дополнить это закрытием окна консоли (потому что у меня оно отказывается закрываться).
Код программы:
C++ (Qt)
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
#include <QCoreApplication>
#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include <algorithm>
#include <assert.h>
#include <memory>
#include <list>
 
#define FILE_PATH "C:\\client.dll"
#define STR_TO_FIND "1134"
#define STR_TO_REPLACE "1590"
 
bool replace(std::string& str, const std::string& from, const std::string& to) {
    size_t start_pos = str.find(from);
    if(start_pos == std::string::npos)
        return false;
    str.replace(start_pos, from.length(), to);
    return true;
}
 
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    std::fstream fs(FILE_PATH, std::ios::in | std::ios::binary| std::fstream::out);
    assert(fs.is_open());
 
    std::vector<std::string> lines;
    std::string buffer;
    while(getline(fs, buffer))
    {
        replace(buffer, STR_TO_FIND, STR_TO_REPLACE);
        lines.push_back(buffer);
    }
    fs.close();
 
    fs.open(FILE_PATH, std::ios::trunc | std::ios::binary| std::fstream::out);
    assert(fs.is_open());
 
    for(size_t i = 0; i < lines.size(); ++i)
    {
        fs << lines[i] << std::endl;
    }
 
    fs.close();
    return a.exec();
}
Заранее огромное спасибо откликнувшимся)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.12.2016, 21:59
Ответы с готовыми решениями:

Как правильно заменить ввод данных простой на ввод с клавиатуры?
#include &quot;stdafx.h&quot; #include &lt;cstdlib&gt; #include &lt;iostream&gt; using namespace...

Ввод данных с клавиатуры
Помогите, пожалуйста... Если я напишу так:cin &gt;&gt; a; То у меня введутся символы...

Ввод данных с клавиатуры
1.«Тестирование коллектива». Пусть целочисленная матрица размером п х т...

Ввод данных с клавиатуры. char
Как считать нажатую клавишу и сохранить в char? в паскале это было примерно...

Ввод данных строки с клавиатуры
Здравствуйте, есть программа которая сортирует все символы строки в обратном...

21
nd2
2835 / 2403 / 1057
Регистрация: 29.01.2016
Сообщений: 8,046
19.12.2016, 00:43 2
Danij, ты как-то определись: если нужно консольное приложение, то убери Qt. Консоль с Qt плохо сочетаются.

Добавлено через 15 минут
Цитата Сообщение от Danij Посмотреть сообщение
Но появилась потребность в вводе числа, на которое меняется первое с клавиатуры.
Если для каждой строки из файла нужно своё число менять (если одно для всех, то вынести ввод за цикл чтения):
C++
1
2
3
4
5
6
7
8
    string find;
    while(getline(fs, buffer))
    {
        std::cout << "Input number: ";
        std::getline(cin, find); // вводится с консоли то, что нужно заменить
        replace(buffer, find, STR_TO_REPLACE);
        lines.push_back(buffer);
    }
1
MrGluck
Модератор
Эксперт CЭксперт С++
8087 / 4940 / 1431
Регистрация: 29.11.2010
Сообщений: 13,398
19.12.2016, 13:07 3
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <algorithm>
#include <fstream>
#include <iostream>
#include <iterator>
#include <string>
 
int main()
{
    std::fstream fs("input.txt");
    if (!fs)
        return 1;
    std::string from = "42", to;
    std::cin >> to;
    std::vector<std::string> v((std::istream_iterator<std::string>(fs)), std::istream_iterator<std::string>());
    fs.clear();
    fs.seekp(0, std::ios::beg);
    std::replace_copy(v.begin(), v.end(), std::ostream_iterator<std::string>(fs, " "), from, to);
}
0
Danij
0 / 0 / 0
Регистрация: 17.12.2016
Сообщений: 41
19.12.2016, 13:07  [ТС] 4
Спасибо конечно за ответ выше, но что-то тут не так. Мне нужно брать с клавиатуры лишь то число, НА которое менять. Изменяемое же число постоянное 1134. Я слегка переписал, теперь это выглядит так. Но вот оно постоянно просит ввести число. Я ввожу, жму Enter, и получаю новую строку с тем же текстом "Input number", и с файлом программа ничего не делает. Что я сделал не так?
C++ (Qt)
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
#include <QCoreApplication>
#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include <algorithm>
#include <assert.h>
#include <memory>
#include <list>
#include <istream>
 
#define FILE_PATH "C:\\client.dll"
#define STR_TO_FIND "1134"
 
 
bool replace(std::string& str, const std::string& from, const std::string& to) {
    size_t start_pos = str.find(from);
    if(start_pos == std::string::npos)
        return false;
    str.replace(start_pos, from.length(), to);
    return true;
}
 
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    std::fstream fs(FILE_PATH, std::ios::in | std::ios::binary| std::fstream::out);
    assert(fs.is_open());
 
 
 
    std::vector<std::string> lines;
    std::string buffer;
    std::string str_to_replace;
    while(getline(fs, buffer))
    {
        std::cout << "Input number: ";
        std::cin >> str_to_replace; // вводится с консоли то, на что нужно заменить
        replace (buffer, STR_TO_FIND, str_to_replace);
        lines.push_back(buffer);
    }
    fs.close();
 
    fs.open(FILE_PATH, std::ios::trunc | std::ios::binary| std::fstream::out);
    assert(fs.is_open());
 
    for(size_t i = 0; i < lines.size(); ++i)
    {
        fs << lines[i] << std::endl;
    }
 
    fs.close();
    return a.exec();
}
0
MrGluck
Модератор
Эксперт CЭксперт С++
8087 / 4940 / 1431
Регистрация: 29.11.2010
Сообщений: 13,398
19.12.2016, 13:08 5
Меняет все числа формата from на to.
Неизвестно в каком формате хранятся данные в файле, я решил учесть вариант, когда в нём не только числа, но и текст.
1
Danij
0 / 0 / 0
Регистрация: 17.12.2016
Сообщений: 41
19.12.2016, 13:17  [ТС] 6
MrGluck, оу, прошу прощения. Писал когда форум лежал, то сообщение адресовано не в ответ Вашему. Все дело в том, что файл у меня .dll (двоичный, как я понял), по этому я открываю его через ::binary... Мне очень трудно разобраться в том варианте, что привели Вы, хотя понимаю, что так лучше. Сейчас проверю работает ли он в таком виде
0
MrGluck
Модератор
Эксперт CЭксперт С++
8087 / 4940 / 1431
Регистрация: 29.11.2010
Сообщений: 13,398
19.12.2016, 13:21 7
Цитата Сообщение от Danij Посмотреть сообщение
по этому я открываю его через ::binary
Добавьте флаг вторым аргументом для переменной типа std::fstream
1
Danij
0 / 0 / 0
Регистрация: 17.12.2016
Сообщений: 41
19.12.2016, 13:44  [ТС] 8
MrGluck, сколько сижу, не доходит до меня как это сюда впихнуть.
В это же место?
std::fstream fs("C:\\client.dll" ,***);
Если так, то binary is not a member of std
C++
1
std::fstream fs("C:\\client.dll",  std::binary);
Если пишу так как ниже (как в моем на Qt), то ios has not been declared
C++
1
std::fstream fs("C:\\client.dll",  ios::binary);
И попутный вопрос, как из этого кода добиться того, чтобы он просил лишь то число, НА которое менять, а менял все время 1134?
0
MrGluck
Модератор
Эксперт CЭксперт С++
8087 / 4940 / 1431
Регистрация: 29.11.2010
Сообщений: 13,398
19.12.2016, 13:53 9
Вот так в теории должно работать
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <algorithm>
#include <fstream>
#include <iostream>
#include <iterator>
#include <string>
 
int main()
{
    std::fstream fs("input.txt", std::ios::in | std::ios::out | std::ios::binary);
    if (!fs)
        return 1;
    std::string from = "1134", to;
    std::cin >> to;
    std::vector<std::string> v((std::istream_iterator<std::string>(fs)), std::istream_iterator<std::string>());
    fs.clear();
    fs.seekp(0, std::ios::beg);
    std::replace_copy(v.begin(), v.end(), std::ostream_iterator<std::string>(fs, " "), from, to);
}
0
Danij
0 / 0 / 0
Регистрация: 17.12.2016
Сообщений: 41
19.12.2016, 15:00  [ТС] 10
MrGluck, а после такого варианта файл перестает открываться даже Notepad++. Не знаю, что с ним происходит, но как факт.

Добавлено через 26 минут
Протестировал этот код на простом файле .txt... Ну совсем это не то, что нужно мне. Во 1 он не заменяет цифры в тексте плана ааааа1134ааа или .1134. Во 2 почему-то все переносы строк сбились тоже. Видимо, без Qt нельзя добиться нужного мне варианта.
0
MrGluck
Модератор
Эксперт CЭксперт С++
8087 / 4940 / 1431
Регистрация: 29.11.2010
Сообщений: 13,398
19.12.2016, 15:03 11
Цитата Сообщение от Danij Посмотреть сообщение
Во 1 он не заменяет цифры в тексте плана ааааа1134ааа или .1134
Нигде не сказано, что числа идут вперемешку с текстом, а не стоят отдельно.
Цитата Сообщение от Danij Посмотреть сообщение
Во 2 почему-то все переносы строк сбились тоже
Про то, что надо сохранить переносы также нигде не слова.

Это совершенно другая задача. А про необходимость уточнения данных я уже писал
Цитата Сообщение от MrGluck Посмотреть сообщение
Неизвестно в каком формате хранятся данные в файле, я решил учесть вариант, когда в нём не только числа, но и текст.
0
Danij
0 / 0 / 0
Регистрация: 17.12.2016
Сообщений: 41
19.12.2016, 15:06  [ТС] 12
MrGluck, да, знаю, ошибка моя. Сам файлик я сюда залил http://rgho.st/6Sg6c4YCW
0
MrGluck
Модератор
Эксперт CЭксперт С++
8087 / 4940 / 1431
Регистрация: 29.11.2010
Сообщений: 13,398
19.12.2016, 15:09 13
Лучший ответ Сообщение было отмечено Danij как решение

Решение

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <fstream>
#include <iostream>
#include <regex>
#include <string>
 
int main()
{
    std::fstream fs("input.txt", std::ios::in | std::ios::out | std::ios::binary);
    if (!fs)
        return 1;
    std::string to;
    std::cin >> to;
    std::string text((std::istreambuf_iterator<char>(fs)), std::istreambuf_iterator<char>());
    fs.clear();
    fs.seekp(0, std::ios::beg);
    std::regex_replace(std::ostreambuf_iterator<char>(fs), text.begin(), text.end(), std::regex("1134"), to);
}
1
Danij
0 / 0 / 0
Регистрация: 17.12.2016
Сообщений: 41
19.12.2016, 15:19  [ТС] 14
MrGluck, спасибо огромное, то что надо. Конечно не моментально, но зато вид не меняется и ввод работает)
0
MrGluck
Модератор
Эксперт CЭксперт С++
8087 / 4940 / 1431
Регистрация: 29.11.2010
Сообщений: 13,398
19.12.2016, 15:22 15
Цитата Сообщение от Danij Посмотреть сообщение
Конечно не моментально
Для файла в 40 Мб поиск подстроки быстро и не получится.
0
Danij
0 / 0 / 0
Регистрация: 17.12.2016
Сообщений: 41
19.12.2016, 16:32  [ТС] 16
Цитата Сообщение от MrGluck Посмотреть сообщение
Для файла в 40 Мб поиск подстроки быстро и не получится.
Просто мой первый приведенный код (сам понятия не имею почему) делал все моментально. Правда как-то криво, ибо он не закрывался сам потом, но, хоть это и странно, менял он все моментально)

Добавлено через 1 час 7 минут
Я решил кроме того дописать код на Qt. Но почему то что бы я не вводил, он удаляет число а не заменяет на введенное. Что здесь не так? Думаю это потому что все в одной функции...
C++ (Qt)
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 <QCoreApplication>
#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include <algorithm>
#include <assert.h>
#include <memory>
#include <list>
#include <istream>
 
#define FILE_PATH "C:\\client.dll"
#define STR_TO_FIND "1134"
 
std::string STR_TO_REPLACE;
 
 
bool replace(std::string& str, const std::string& from, const std::string& to) {
    size_t start_pos = str.find(from);
    if(start_pos == std::string::npos)
        return false;
    str.replace(start_pos, from.length(), to);
    return true;
}
 
int main(int argc, char *argv[])
{
 
       std::cout << "Input number: ";
       std::cin >> STR_TO_REPLACE; // вводится с консоли то, на что нужно заменить
 
    QCoreApplication a(argc, argv);
    std::fstream fs(FILE_PATH, std::ios::in | std::ios::binary| std::fstream::out);
    assert(fs.is_open());
 
    std::vector<std::string> lines;
    std::string buffer;
    while(getline(fs, buffer))
    {
        replace(buffer, STR_TO_FIND, STR_TO_REPLACE);
        lines.push_back(buffer);
    }
    fs.close();
 
    fs.open(FILE_PATH, std::ios::trunc | std::ios::binary| std::fstream::out);
    assert(fs.is_open());
 
    for(size_t i = 0; i < lines.size(); ++i)
    {
        fs << lines[i] << std::endl;
    }
 
    fs.close();
    return a.exec();
}
0
nd2
2835 / 2403 / 1057
Регистрация: 29.01.2016
Сообщений: 8,046
20.12.2016, 00:38 17
Цитата Сообщение от Danij Посмотреть сообщение
Я решил кроме того дописать код на Qt. Но почему то что бы я не вводил, он удаляет число а не заменяет на введенное. Что здесь не так? Думаю это потому что все в одной функции...
Проверил я этот код на твоём файле. Всё работает. Чтобы быстро было - делай Release, Qt тут никак не помогает. И сделай вывод сообщения после чтения и записи, а то непонятно: как ты вообще определяешь скорость работы, если консоль (с Qt) у тебя висит.
1
Danij
0 / 0 / 0
Регистрация: 17.12.2016
Сообщений: 41
20.12.2016, 00:40  [ТС] 18
nd2, да, тут уже готово, я и с вводом разобрался и со всеми сообщениями, спасибо)
0
nd2
2835 / 2403 / 1057
Регистрация: 29.01.2016
Сообщений: 8,046
20.12.2016, 00:43 19
Лучший ответ Сообщение было отмечено Danij как решение

Решение

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
#include <QCoreApplication>
#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include <algorithm>
#include <assert.h>
#include <memory>
#include <list>
#include <istream>
 
#define FILE_PATH "client.dll"
#define STR_TO_FIND "1134"
 
std::string STR_TO_REPLACE;
 
 
bool replace(std::string& str, const std::string& from, const std::string& to) 
{
    size_t start_pos = str.find(from);
    if(start_pos == std::string::npos)
        return false;
    str.replace(start_pos, from.length(), to);
    return true;
}
 
int main(int argc, char *argv[])
{
 
   std::cout << "Input number: ";
   std::cin >> STR_TO_REPLACE; // вводится с консоли то, на что нужно заменить
 
    QCoreApplication a(argc, argv);
    std::fstream fs(FILE_PATH, std::ios::in | std::ios::binary | std::fstream::out);
    assert(fs.is_open());
 
    std::vector<std::string> lines;
    std::string buffer;
    while(getline(fs, buffer))
    {
        replace(buffer, STR_TO_FIND, STR_TO_REPLACE);
        lines.push_back(buffer);
    }
    fs.close();
    std::cout << "Done read!" << std::endl;
 
    fs.open(FILE_PATH, std::ios::trunc | std::ios::binary| std::fstream::out);
    assert(fs.is_open());
 
    for(size_t i = 0; i < lines.size(); ++i)
    {
        fs << lines[i] << std::endl;
    }
 
    fs.close();
    std::cout << "Done write!" << std::endl;
    return a.exec();
}
1
Миниатюры
Ввод данных с клавиатуры   Ввод данных с клавиатуры  
nd2
2835 / 2403 / 1057
Регистрация: 29.01.2016
Сообщений: 8,046
20.12.2016, 00:44 20
Цитата Сообщение от Danij Посмотреть сообщение
да, тут уже готово, я и с вводом разобрался и со всеми сообщениями
Написал бы, что разобрался.
1
20.12.2016, 00:44
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.12.2016, 00:44

Ввод данных в массив с клавиатуры
Ребят помогите.Нужен код , который бы заполнял массив с клавиатуры 3х4 . Вот...

Ввод с клавиатуры данных в массив
Нужна помощь, 1)Определить класс с именем AEROFLOT, содержащий след поля:...

Ввод с клавиатуры данных в массив
Написать программу выполняющую след. действия: -ввод с клавиатуры данных в...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

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