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

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

Войти
Регистрация
Восстановить пароль
 
 
Danij
0 / 0 / 0
Регистрация: 17.12.2016
Сообщений: 41
#1

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

18.12.2016, 21:59. Просмотров 450. Ответов 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
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Ввод данных с клавиатуры (C++):

Как правильно заменить ввод данных простой на ввод с клавиатуры? - C++
#include &quot;stdafx.h&quot; #include &lt;cstdlib&gt; #include &lt;iostream&gt; using namespace std; int _tmain(int argc, _TCHAR* argv) ...

Ввод данных с клавиатуры - C++
1.«Тестирование коллектива». Пусть целочисленная матрица размером п х т содержит информацию об учениках некоторого класса из п человек. В...

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

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

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

Ввод данных строки с клавиатуры - C++
Здравствуйте, есть программа которая сортирует все символы строки в обратном порядке. Подскажите как правильно сделать чтобы эта строка...

21
nd2
2414 / 2003 / 705
Регистрация: 29.01.2016
Сообщений: 6,552
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Эксперт С++
7511 / 4643 / 700
Регистрация: 29.11.2010
Сообщений: 12,678
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Эксперт С++
7511 / 4643 / 700
Регистрация: 29.11.2010
Сообщений: 12,678
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Эксперт С++
7511 / 4643 / 700
Регистрация: 29.11.2010
Сообщений: 12,678
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Эксперт С++
7511 / 4643 / 700
Регистрация: 29.11.2010
Сообщений: 12,678
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Эксперт С++
7511 / 4643 / 700
Регистрация: 29.11.2010
Сообщений: 12,678
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Эксперт С++
7511 / 4643 / 700
Регистрация: 29.11.2010
Сообщений: 12,678
19.12.2016, 15:09 #13
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
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Эксперт С++
7511 / 4643 / 700
Регистрация: 29.11.2010
Сообщений: 12,678
19.12.2016, 15:22 #15
Цитата Сообщение от Danij Посмотреть сообщение
Конечно не моментально
Для файла в 40 Мб поиск подстроки быстро и не получится.
0
19.12.2016, 15:22
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.12.2016, 15:22
Привет! Вот еще темы с ответами:

Ввод данных с клавиатуры. char - C++
Как считать нажатую клавишу и сохранить в char? в паскале это было примерно так: c:=readkey; а как в с\с++?

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

Добавить в программу ввод данных с клавиатуры - C++
int main(int argc, char** argv) { string Target(&quot;12345678&quot;); Target.insert(3, &quot;-+-&quot;); MessageBox(NULL, Target.c_str(),...

Добавить в программу ввод данных с клавиатуры - C++
using namespace std; #include &lt;iostream&gt;; void main() { setlocale(0,&quot;&quot;); const int N = 15; int arr = {1, 2, 3, 0, 9, -1,...


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

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

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