2016-12-05 4 views
0

Чтобы создать несколько файлов, используя цикл for в C++.Как создать несколько файлов с помощью C++

Цель: - Для того, чтобы создать несколько файлов в соответствующей папке, как 1.TXT, 2.txt, 3.txt

Вот мой пример кода:

int co = 3; 
for (int i = 1; i <= co; i++) 
{ 
    ofstream file; 
    file.open (i+".txt"); 
    file.close(); 
} 

Этот код создает три файла: t, xt и txt.

Что происходит в этом коде? и что не так с моим кодом?

+0

Вы должны преобразовать i в строку раньше. –

+0

Попробуйте преобразовать переменную i в String. – Prometheus

+0

Идиома 'i +". Txt "' работает так, как будто '. .txt" является * массивом * и поэтому вы получаете смещение к символу 'i' этой строки. Следовательно, 'txt' (смещение 1),' xt' (смещение 2) и 't' (смещение 3). – usr2564301

ответ

1

В C++ вы не можете просто «конкатенировать» строковый литерал с целым числом. Строковый литерал будет разлагаться на указатель на постоянный символ (char const *) и применяются правила арифметики указателя.

При добавлении или вычитании целочисленного значения из указателя результат является указателем на объект, который представляет собой число элементов в памяти, и, конечно, это выполняется только в том случае, если границы этой памяти не пересекаются.

0

Вы должны преобразовать i в std::string первый:

int co = 3; 
for (int i = 1; i <= co; i++){ 
    ofstream file; 
    file.open (std::to_string(i) + ".txt"); //Here 
    file.close(); 
} 
0

Вы должны преобразовать i в строку, чтобы сцепить его с помощью operator+, в противном случае вы будете случайно выполнить :

// C++11 
int co = 3; 
for (int i = 1; i <= co; i++) 
{ 
    ofstream file; 
    file.open (std::to_string(i) + ".txt"); 
    file.close(); 
} 

Если у вас нет доступа к C++ 11 (или если вы хотите явно не «конвертировать i, а затем конкатенировать»), вы можете использовать std::ostringstream:

// C++03 
std::ostringstream oss; 
int co = 3; 
for (int i = 1; i <= co; i++) 
{ 
    ofstream file; 

    oss << i << ".txt"; // `i` is automatically converted 
    file.open (oss.str()); 
    oss.str(""); // clear `oss` 

    file.close(); 
} 

Примечание:лязг ++ уловы это ошибка с -Wstring-plus-int предупреждения флага (wandbox example).

+0

Вы ошибаетесь. Прежде всего '' .txt "' не 'std :: string'. Во-вторых, 'int + char *' отлично определен: он перемещает указатель. Вот почему OP получает фрагменты имени .txt 'filename на каждой итерации. – freakish

+0

@ freakish: спасибо, исправлено. Я слишком привык к '' ... 's' literal, я думаю :( –

+0

Также в случае clang ++ кажется, что' -Wstring-plus-int' всегда показывает это предупреждение, независимо от того, что 'i' является По крайней мере, это то, что я наблюдал, но не уверен. – freakish