2016-03-18 2 views
2

Я хочу скопировать содержимое файла1 в файл2 точно так же, как и они (сохранение пробелов и символов перевода строки). Я специально хочу скопировать это содержимое на один маленький блок символов одновременно (это небольшой сегмент крупного проекта, так что несите меня).Прочитать блок файла по блоку в C

я попытался следующее:

#include <stdio.h> 
#include <stdlib.h> 

#define MAX 5 

int main(int argc, char *argv[]) { 
    FILE *fin, *fout; 
    char buffer[MAX]; 
    int length; 
    char c; 

    if((fin=fopen(argv[1], "r")) == NULL){ 
     perror("fopen"); 
     exit(EXIT_FAILURE); 
    } 

    if((fout=fopen(argv[2], "w")) == NULL){ 
     perror("fopen"); 
     exit(EXIT_FAILURE); 
    } 

    while(1){ 
     length = 0; 
     while((c = fgetc(fin)) != EOF && length < MAX){ 
      buffer[length++] = (char) c; 
     } 
     if(length == 0){ 
      break; 
     } 
     fprintf(fout, "%s", buffer); 
    } 
    fclose(fout); 
    fclose(fin); 
} 

Однако, это приводит к неверным результатам моей file2. Любой вход был бы оценен.

+0

'getc' (и' getchar', 'fgetc') возвращает [**' int' ** not ** 'char' **] (http://stackoverflow.com/questions/35356322/difference- между-ИНТ-и-гольца-в-GetChar-и-putchar). ** 'int c' ** –

+0

- это не« фиксировано »при помощи typginging с помощью' (char) c'? –

+0

http://stackoverflow.com/questions/35356322/difference-between-int-and-char-in-getchar-and-putchar –

ответ

1

Ваш буфер не имеет нулевого конца. Используйте fwrite вместо fprintf:

fwrite(buffer, 1, length, fout); 

И вы также должны проверить ошибку. Поэтому сравните код возврата fwrite с номером length, и если он отличается, повторите запись оставшихся байтов (если положительный) или напечатайте соответствующее сообщение об ошибке через perror("fwrite") (если код возврата отрицательный).

Кроме того, вы можете рассмотреть возможность открытия файлов в двоичном режиме, что может вызвать разницу в окнах, то есть передать "rb" и "wb" в fopen.

И последнее, но не в последнюю очередь, а не зацикливание и получить один символ в то время, рассмотреть возможность использования fread вместо:

length = fread(buffer, 1, MAX, fin); 
0

Вот простой пример (без проверки ошибок)

Вы должны. используйте fwrite(), так как строка, которую вы должны записать в файл, не является «завершенной нулем». А также обратите внимание, что режим «b» указан с помощью функции fopen(), что означает, что вы хотите открыть файл в виде двоичного файла.

#include <stdio.h> 
#include <stdlib.h> 
#define MAX 5 
#define FILE_BLOCK_SIZE 50 
int _tmain(int argc, _TCHAR* argv[]) 
{ 
    FILE *fin, *fout; 
    unsigned char *BufContent = NULL; 
    BufContent = (unsigned char*) malloc(FILE_BLOCK_SIZE); 
    size_t BufContentSz; 

    if((fin=fopen("E:\\aa.txt", "rb")) == NULL){ 
     perror("fopen"); 
     exit(EXIT_FAILURE); 
    } 
    if((fout=fopen("E:\\bb.txt", "wb")) == NULL){ 
     perror("fopen"); 
     exit(EXIT_FAILURE); 
    } 

    while ((BufContentSz = fread(BufContent, sizeof(unsigned char), FILE_BLOCK_SIZE, fin)) > 0) 
    { 
     fwrite(BufContent, sizeof(unsigned char), BufContentSz, fout); 
    } 

    fclose(fout); 
    fclose(fin); 

    delete BufContent; 
    return 0; 
} 
0

Во-первых, изменить char buffer[MAX]; к int buffer[MAX]; и char c; к int c;, для char может быть signed char или unsigned char, в зависимости от реализации. В более позднем случае c = EOF даст c большое положительное число (в любом случае оно без знака), поэтому цикл никогда не кончится. A int будет достаточно большим, чтобы удерживать все символы и EOF.

Затем измените ваш

fprintf(fout, "%s", buffer); 

в

fwrite(buffer, 1, length, four); 

Это происходит потому, что fprintf(fout, "%s", buffer); вызов для строки C-стиле, с концами с '\0', но ваш buffer не нулем , В результате программа будет продолжать копировать материал в стек, пока не будет выполнена '\0', оставив много мусора в файле2.

Смежные вопросы