Я пытаюсь создать текстовый файл с аргументами [1], которые должны быть целыми числами. Имя файла должно быть ex «3.txt», но файл, который я получаю, называется просто «t». Аргумент числа правильный, но имя файла почему-то становится неправильным. Какие предложения у вас есть, чтобы улучшить этот код и удобочитаемость и удобство использования?
int main(int argc,char *args[])
{
ofstream myFile;
int num = atoi(args[1]);
myFile.open(num + ".txt");
if (myFile.is_open())
{
myFile << "num\n" ;
for(int i=num; i > 0; i--)
myFile << i + ",";
myFile.close();
}
}
Ваши проблемы возникают из-за использования неправильных типов. Прежде всего int() + "text"
определены, но не делает то, что вы ожидаете. Это не операция со строками, но на указатели. Тебе лучше использовать язык. C ++ содержит станд :: строка и это будет легко с ним. Первоначально вы должны сделать строку из args[1]
:
string num(args[1]);
Конечно, это должно быть выдано и вам нужно проверить это самое подходящее!
if(argc < 2)
//some throw
После этого оператор plus
будет работать в соответствии с вашими пожеланиями. Итак, вы просто добавляете «.txt» к num
,
num += ".txt"
Теперь вы должны открыть файл с ofstrem. Это ожидать const char*
и строка по указанному адресу должна заканчиваться '\0'
так что вы можете использовать станд :: basic_string :: c_str.
ofstream my_file(num.c_str());
Хорошо знать, так как C ++ 11 вы можете дать просто std :: string:
ofstream my_file(num);
Давайте перейдем к основной теме («C ++ arguments to integer»). Вы можете просто использовать СТД :: стои. Как видите, вам не нужно беспокоиться о символах после числа.
for(int i=stoi(num); i > 0; i--)
myFile << i << ","; //it can't be i + "," - as above
Или, если вы хотите преобразовать непосредственно аргумент в целое число, у вас есть возможность использовать станд :: atoi.
int i = atoi(args[1]);
Наконец начало вашего кода должно выглядеть так:
if(argc < 2)
{//some throw}
ofstream myFile;
string num =string(args[1])+".txt";
myFile.open(num.c_str());
Хитрый Когда вы делаете:
myFile.open(num + ".txt");
…вы на самом деле не переводите int как строку. Вместо этого вы принимаете char const*
то есть ".txt"
и сдвинуть его num
(3 в вашем случае) символы перед тем, как передать его на открытие, отсюда ваш файл «t».
Я вижу, что вы используете C ++. Избавьте себя от головной боли, используя std::string
и C ++ 11 std::to_string
функции, если вы можете.
Я не вижу причины, по которой вы конвертируете аргумент командной строки в число на 1-м месте здесь.
Измени свой код как
myFile.open((std::string(argv[1]) + ".txt").c_str());
или для более поздних версий компилятора (способных C ++ 11 стандарты)
myFile.open(std::string(argv[1]) + ".txt");
Вам не нужно иметь argv[1]
преобразуется в числовое значение.