2013-09-10 6 views
1

Я новичок в C++ и работаю над простым проектом. В основном, где я сталкиваюсь с проблемой, создается файл с номером (int) в имени файла. Как я вижу, мне нужно сначала преобразовать int в строку (или char array), а затем объединить эту новую строку с остальной частью имени файла.C++ int string, concatenate string

Вот мой код так далеко, что не удается скомпилировать:

int n; //int to include in filename 
char buffer [33]; 
itoa(n, buffer, 10); 
string nStr = string(buffer); 

ofstream resultsFile; 
resultsFile.open(string("File - ") + nStr + string(".txt")); 

Это дает ошибки пара компиляции (компиляция в Linux):

  1. itoa не объявлен в этой области
  2. нет функция соответствия для вызова в 'std :: basic_ofstream char, std :: char_traits char :: open (std :: basic_string char, std :: char_traits char, std :: allocator char)'

Я пробовал совет здесь: c string and int concatenation и здесь: Easiest way to convert int to string in C++ не повезло.

Если я использую метод to_string, я получаю сообщение об ошибке «to_string не является членом std».

+0

Если вы можете позволить себе C++ 11, гораздо проще преобразовать целое число в строку - это использовать 'std :: to_string'. См. Мой ответ для примера. – vitaut

ответ

6

Вы можете использовать stringstream построить имя файла.

std::ostringstream filename; 
filename << "File - " << n << ".txt"; 
resultsFile.open(filename.str().c_str()); 
+0

Это выглядит многообещающе. Однако, когда я компилирую код, я получаю ошибку: «aggregate» std :: ostringstream filename имеет неполный тип и не может быть определен « –

+1

Я не признаю эту ошибку. Вам нужно '#include ' в верхней части исходного файла. – cdmh

+0

Проблема решена. –

1

Вы хотите использовать boost::lexical_cast. Кроме того, необходимо включить все необходимые заголовки:

#include <boost/lexical_cast> 
#include <string> 
std::string nStr = boost::lexical_cast<std::string>(n); 

, то это просто:

std::string file_name = "File-" + nStr + ".txt"; 

потому что std::strng играет хорошо с строковых литералов (например, «.txt»).

+0

Или, если у вас его нет, используйте строковый поток. – cdbitesky

1

Для itoa, скорее всего, вам не хватает #include <stdlib.h>. Обратите внимание, что itoa является нестандартным: стандартные способы форматирования целого числа как строки как sprintf и std::ostringstream.

ofstream.open() принимает const char*, а не std::string. Используйте метод .c_str() для получения первого из последнего.

Собираем вместе, вы ищете что-то вроде этого:

ostringstream nameStream; 
nameStream << "File - " << n << ".txt"; 
ofstream resultsFile(nameStream.str().c_str()); 
1

иСПользоВание std::ostringstream:

std::ostringstream os; 
os << "File - " << nStr << ".txt"; 
std::ofstream resultsFile(os.str().c_str()); 

с использованием std::to_string (C++ 11):

std::string filename = "File - " + std::to_string(nStr) + ".txt"; 
std::ofstream resultsFile(filename.c_str()); 
0

Вы можете использовать std::stringstream

std::stringstream ss; 
ss << "File - " << n << ".txt"; 

Поскольку конструктор требует указатель обугленного, вы должны преобразовать его в указатель полукокса с помощью

ofstream resultsFile(ss.str().c_str()); 
Смежные вопросы