Библиотека времени выполнения Microsoft Visual Studio C обнаружила фатальную ошибку в filecopy.exe - PullRequest
0 голосов
/ 14 ноября 2011

Это самая простая программа, но у меня есть эта ошибка. Я копирую всю информацию из одного файла в другой. (Честно говоря, мне нужно скопировать информацию из нескольких файлов)

 #include <stdio.h>
 #include <string.h>

 void CopyTo(FILE *x)
 {
    FILE *f0;
    char *s=new char[100];
    f0=fopen("file0.txt","wt+");
    while(fgets(s,sizeof(s),x))
    {
        fwrite(s,1,strlen(s)+1,x);
    }
    fclose(f0);    
 };

 int main()
 {
    FILE *fi;
    fi=fopen("file1.txt","rt");
    CopyTo(fi);
    fclose(fi);
    printf("finish");
    getchar();
 }

Ответы [ 2 ]

3 голосов
/ 15 ноября 2011

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

Я считаю, что у вас есть следующие проблемы:

  1. Вы выделяетебуфер в куче и не удается его освободить.
  2. Ваш буфер довольно мал.Вероятно, было бы более эффективно использовать больший буфер.
  3. Использование fgets и strlen строковых функций, ориентированных на C, не подходит для операции побайтового копирования.

Я бы написал так:

void CopyTo(FILE *x)
{
    FILE *f0;
    char buff[16*1024];//16kB buffer, stack allocated
    size_t count;

    f0=fopen("file0.txt", "wt+");
    do
    {
        count = fread(&buff, 1, sizeof(buff), x);
        if (!ferror(x))
        {
            fwrite(&buff, 1, count, f0);
        }
    } while (count == sizeof(buff));
    fclose(f0);    
};

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

1 голос
/ 14 ноября 2011

Похоже, вы пытаетесь читать и записывать в один и тот же файл (x). Не должно ли это быть fwrite(s,1,strlen(s),f0)?
UPDATE
Кроме того, я считаю, что это должно быть while(fgets(s,100,x)), потому что sizeof(s) возвращает размер (char*)

...