#c
#c
Вопрос:
Я хотел бы прочитать ввод из командной строки, и если это целое число, записать его вместе с его шестнадцатеричным форматом в файл, и если пользователь вводит «end», цикл должен завершиться.
#include <iostream>
#include <string>
#include <sstream>
#include <fstream>
void numToFile() {
int i;
std::string input;
std::ofstream ofs;
ofs.open("outputFile.txt", std::ios::out | std::ios::trunc);
while (input != "end") {
std::cin >> input;
ofs << input << " = 0x" << std::ios::hex << input << std::endl;
}
ofs.close();
}
int main() {
numToFile();
}
Однако в выходном файле я нахожу этот вывод:
12 = 0x204812
34 = 0x204834
49 = 0x204849
end = 0x2048end
Не совсем уверен, как направить ввод в строку или в целое число для преобразования в шестнадцатеричный формат.
Редактировать:
Including `stoi`:
#include <iostream>
#include <string>
#include <sstream>
#include <fstream>
#include <iomanip>
void numToFile() {
int i;
std::string input;
std::ofstream ofs;
ofs.open("outputFile.txt", std::ios::out | std::ios::trunc);
while (input != "end") {
std::cin >> input;
ofs << std::setw(5) << std::setfill('0');
// NOT: std::ios::hex !?
ofs << input << " = 0x" << std::hex << std::stoi(input) << std::endl;
}
ofs.close();
}
Комментарии:
1. Ваша
input
переменная — astd::string
— если вы хотите преобразовать ее в anint
, вы должны сделать это явно, например: черезstd::stoi
: en.cppreference.com/w/cpp/string/basic_string/stol2. Это
hex
cout << hex
неstd::ios::hex
(битовый флаг, имеющий значение 2048), этоstd::hex
специальный объект, называемый «манипулятором ввода-вывода», который изменяет параметры в потоке, в который он вставляется, вместо генерации выходных данных. Ну, «манипулятор ввода-вывода» может быть объектом function или простой функцией, а этот на самом деле является простой функцией.3. Я включил
stoi
вызов. Преобразование записывается в выходной файл, но при вводеend
происходит сбой программы: Необработанное исключение в 0x00007FFD47663B29 в HexTableToFile.exe : Исключение Microsoft C : std::invalid_argument в ячейке памяти 0x000000EBDCEFF740. произошло4. Вы выполняете проверку input != «end» после попытки преобразовать его в int . Это тоже нужно исправить.
5. Аргументы командной строки передаются вашему
int main(int argc, char**argv)
Ответ №1:
Вам нужно как можно скорее проверить, является ли ввод допустимым или нет.
void numToFile() {
int i;
std::string input;
std::ofstream ofs;
ofs.open("outputFile.txt", std::ios::out | std::ios::trunc);
while (std::cin>>input) {
if(input == "end") break;
ofs << std::setw(5) << std::setfill('0');
// NOT: std::ios::hex !?
ofs << input << " = 0x" << std::hex << std::stoi(input) << std::endl;
}
ofs.close();
}