Как ввести строку или целое число в программу на C из командной строки?

#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 переменная — a std::string — если вы хотите преобразовать ее в an int , вы должны сделать это явно, например: через std::stoi : en.cppreference.com/w/cpp/string/basic_string/stol

2. Это 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();
}