Как приостановить запись файла, когда файл достигает определенного размера, а затем создать новый файл - PullRequest
0 голосов
/ 16 ноября 2010

У меня есть значительный объем данных, генерируемых в программе на Си.Я хочу записать данные в файлы размером 1 ГБ.

Как бы я это сделал?

В данный момент я выполняю цикл while (с условием, которое будет продолжаться до5 ГБс данных).Он создает структуру и записывает ее в файл:

fwrite(storedVal, sizeof(keyEncode),1,fp);
//storedVal being the struct (which contains my data)

Я бы хотел, чтобы каждый файл назывался code1, codes2 и увеличивался до завершения цикла while.Я уверен, что он будет содержать оператор if, основанный на размере текущего файла, в который он записывает.Затем, когда он достигает 1 ГБ, он начинается с нового файла.

edit //

на самом деле это должен быть оператор типа while, который продолжает запись до размера, пока файл не достигнет 1 ГБи начинается с нового

Мой файл в данный момент открывается перед моим циклом while:

fp = fopen("keys.dat", "wb");
while(condition is true) {
    //create a new struct with data and
    fwrite(storedVal, sizeof(keyEncode),1,fp);
}

Ответы [ 2 ]

2 голосов
/ 16 ноября 2010

Что-то вроде следующего: обратите внимание, что некоторые части оставлены для заполнения.

int write_count = 0;
int file_idx = 1;
FILE *fp;
char filename[20];

sprintf( filename, "codes%d", file_idx );
file_idx++;
fp = fopen(filename, "wb");

while( foo ) {

    //update data

    if( write_count + sizeof(keyEncode) > ONE_GIGABYTE ) {
        fclose(fp);
        write_count = 0;
        sprintf( filename, "codes%d", file_idx );
        file_idx++;
        fp = fopen(filename, "wb");
    }

    fwrite(storedVal, sizeof(keyEncode),1,fp);
    write_count += sizeof(keyEncode);
}

fclose(fp);

Обновление

Вы можете включить подобную логику в вспомогательную функцию для записи, согласно ответу Аарона. Обратите внимание, что вам придется сделать некоторые элементы данных глобальными, и это не будет потокобезопасным.

1 голос
/ 16 ноября 2010

Создайте набор маленьких вспомогательных функций, которые работают так же, как fopen() / fwrite(), но работают с собственной структурой данных вместо FILE*.

, что позволяет сохранить имя файлав вашей структуре закройте реальный файл и откройте новый, когда ваша реализация fwrite() заметит, что было записано достаточно данных.

Если вы хотите перехватить это, используйте пару макросов, чтобыпереписать исходные методы:

#define fopen my_fopen

Разумеется, они не должны использоваться для ваших вспомогательных функций.

Но это позволяет вам скомпилировать старый код и «волшебным образом» изменить его поведение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...