Как динамически изменить имя файла при записи в цикле? - PullRequest
13 голосов
/ 20 ноября 2010

Я хотел бы сделать что-то вроде этого: В цикле, первая итерация записывает некоторый контент в файл с именем file0.txt, вторая итерация file1.txt и так далее, просто увеличьте число.

FILE *img;
int k = 0;
while (true)
{
            // here we get some data into variable data

    file = fopen("file.txt", "wb");
    fwrite (data, 1, strlen(data) , file);
    fclose(file );

    k++;

            // here we check some condition so we can return from the loop
}

Ответы [ 5 ]

16 голосов
/ 20 ноября 2010
int k = 0;
while (true)
{
    char buffer[32]; // The filename buffer.
    // Put "file" then k then ".txt" in to filename.
    snprintf(buffer, sizeof(char) * 32, "file%i.txt", k);

    // here we get some data into variable data

    file = fopen(buffer, "wb");
    fwrite (data, 1, strlen(data) , file);
    fclose(file );

    k++;

    // here we check some condition so we can return from the loop
}
7 голосов
/ 20 ноября 2010

Другой способ сделать это в C ++:

#include <iostream>
#include <fstream>
#include <sstream>

int main()
{
    std::string someData = "this is some data that'll get written to each file";
    int k = 0;
    while(true)
    {
        // Formulate the filename
        std::ostringstream fn;
        fn << "file" << k << ".txt";

        // Open and write to the file
        std::ofstream out(fn.str().c_str(),std::ios_base::binary);
        out.write(&someData[0],someData.size());

        ++k;
    }
}
2 голосов
/ 20 ноября 2010

, поэтому создайте имя файла, используя sprintf:

char filename[16]; 
sprintf( filename, "file%d.txt", k );  
file = fopen( filename, "wb" ); ...

(хотя это решение C, поэтому тег неверен)

2 голосов
/ 20 ноября 2010
FILE *img;
int k = 0;
while (true)
{
    // here we get some data into variable data
    char filename[64];
    sprintf (filename, "file%d.txt", k);

    file = fopen(filename, "wb");
    fwrite (data, 1, strlen(data) , file);
    fclose(file );
    k++;

            // here we check some condition so we can return from the loop
}
1 голос
/ 11 декабря 2014

Я выполнил это следующим образом. Обратите внимание, что в отличие от нескольких других примеров, он на самом деле будет компилироваться и функционировать так, как задумано, без каких-либо изменений, кроме включений препроцессора. Решение ниже перебирает пятьдесят имен файлов.

int main(void)
{
    for (int k = 0; k < 50; k++)
    {
        char title[8];
        sprintf(title, "%d.txt", k);
        FILE* img = fopen(title, "a");
        char* data = "Write this down";
        fwrite (data, 1, strlen(data) , img);
        fclose(img);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...