2014-09-18 6 views
0

Я пытаюсь разбить файл на несколько меньших файлов. Проблема в том, что размер (который пользователь дает) больше, чем буфер, программа сработает, в противном случае она работает нормально. Может ли кто-нибудь помочь? Вот код:Как разбить файл на несколько файлов в C?

char * buffer = (char *)malloc(400); 
FILE *exsistingFile = fopen(filename,"rb"); 

do 
{ 

    /*reading from a file */  
    bytesRead = fread(buffer, sizeof(char), size, exsistingFile); 

    /*exits if its 0 */ 
    if (bytesRead == 0) 
    { 
     printf("The reading has finished or the file has no data inside\n"); 
     return 0; 
    } 

    fileCount ++; 
    sprintf (newFileName,"%s%04i",output,fileCount); 


    /* opening the new file bye the name given by the user */ 
    outputFile = fopen(newFileName,"w"); 



    /*checking whether the file is opened or not*/ 
    if (!outputFile) 
    { 
     printf("File %s cannot be opened for reading\n", filename); 
     return E_BAD_DESTINATION; 
    } 

    /*write to file from the buffer*/ 
    fwrite(buffer,sizeof(char),bytesRead,outputFile); 

    /*closing the output file*/ 
    fclose(outputFile); 


    } while (bytesRead > 0); 
+0

По крайней мере, для текстовых файлов я бы циклически читал строки за строкой (например, используя [getline (3)] (http://man7.org/linux/man-pages/man3/getline.3.html). ..). У BTW Linux и Posix есть [split (1)] (http://man7.org/linux/man-pages/man1/split.1.html) и [csplit (1)] (http://man7.org/ linux/man-pages/man1/csplit.1.html). Вы можете использовать их или изучать исходный код, поскольку это бесплатное программное обеспечение. –

+0

Ваш открытый для записи не работает, поэтому вы выводите сообщение о том, что входной файл не может быть прочитан ???? – user3629249

+0

простое исправление, буфер malloc с использованием размера, а не фиксированное значение 400 – user3629249

ответ

0

Итак, malloc буфер, размер которого такой же размер, что и пользователь? Или только чтение и запись в битах по 400 байт, пока вы не достигнете размера, который дал пользователь.

char * buffer = (char *)malloc(400); 
FILE *exsistingFile = fopen(filename,"rb"); 

do 
{ 
    fileCount ++; 
    sprintf (newFileName,"%s%04i",output,fileCount); 

    /* opening the new file bye the name given by the user */ 
    outputFile = fopen(newFileName,"w"); 

    /*checking whether the file is opened or not*/ 
    if (!outputFile) 
    { 
     printf("File %s cannot be opened for writing\n", filename); 
     return E_BAD_DESTINATION; 
    } 

    int workSize = size; 
    while (workSize) 
    { 
     int chunkSize = workSize > 400 ? 400 : workSize; 

     /*reading from a file */  
     bytesRead = fread(buffer, sizeof(char), chunkSize, exsistingFile); 
     workSize -= bytesRead; 

     /*exits if its 0 */ 
     if (bytesRead == 0) 
     { 
      printf("The reading has finished or the file has no data inside\n"); 
      return 0; 
     } 

     /*write to file from the buffer*/ 
     fwrite(buffer,sizeof(char),bytesRead,outputFile); 
    } 

    /*closing the output file*/ 
    fclose(outputFile); 

} while (bytesRead > 0); 

Нечто подобное. За исключением, может быть, нескольких ошибок, но вы поняли эту идею. Это домашнее задание?

+0

Да, я хочу читать и писать только биты 400, но проблема в том, что если файл разбит на более 2 файлов. Например, если буфер составляет 400, размер файла 1000 и пользователь хочет кусок разбитого файла 450. Поэтому необходимо создать 3 файла. В этом случае, что вы делаете. – 2014-09-18 11:01:34

+0

Сделайте две петли. Внешний цикл заботится о создании выходных файлов, а внутренний цикл заботится о чтении данных в размере, указанном пользователем. – Emiel

+0

вот что меня беспокоит, если бы вы могли попробовать и изменить программу, это было бы полезно, поскольку я попытался, но неудачно с двумя петлями. – 2014-09-18 11:15:44

1
size_t currentSize = (size >= 400) ? 400 : size; 
size -= currentSize; 

И тогда Fread только currentSize

+0

да, но тогда будет другая причина записи цикла, если будет более двух файлов. Например, если буфер составляет 400, размер файла 1000 и пользователь хочет кусок разбитого файла 450. Поэтому необходимо создать 3 файла. В этом случае, что вы делаете. – 2014-09-18 10:59:29

+0

Что это значит? Я не вижу проблемы. – deviantfan

+0

Скажем, файл для разбиения составляет 2000 байт. пользователь дал размер 500, а буфер - 400.теперь мы задаем размер 400, затем он откроет файл, напишите, что он закрыл его, и он напишет остальные 100 в другой файл. Я хочу, чтобы он написал всего 500 файлов. – 2014-09-18 11:06:34

0

Если size является пользовательский ввод, вы должны выделить буфер в соответствии с данным входом, а не с жестко заданным значением.

+0

Если пользователь дает очень большое число, моя программа выйдет из строя, так как os не будет выделять такую ​​огромную память. – 2014-09-18 11:02:07

+0

@JahirShah: Нет, вы должны проверить результат 'malloc', а затем' {perror ("malloc"); exit (EXIT_FAILURE);} 'при сбое. –

+0

Да, на самом деле я должен взять буфер как 4096. Не могу изменить это. и если пользовательские входы 6000, я не могу свернуть программу с него. – 2014-09-18 11:55:48