为什么我的代码不能使用sprintf和fopen打开一个新文件?

时间:2017-09-23 23:30:31

标签: c printf fopen fwrite fread

int main()
{
    int size = 512, i = 1;
    char buffer[1000];
    char *newFileTemp;
    char const *chunk = "Chunk";
    memset(buffer, 0, sizeof(buffer));
    FILE *fb;
    FILE *fp=fopen("blah.txt", "r");
    if (fp == NULL)
    {
        perror("doesnt exist");
        return 0;
    }

     fread(buffer,sizeof(char),sizeof(buffer), fp);
     sprintf(newFileTemp, "%s%i", chunk, i);

     printf("blah check %s",newFileTemp);
     fb = fopen(newFileTemp, "wb");
     if (fb == NULL)
     {
         perror("doesnt exist");
         return 0;
     }
     fwrite(buffer, sizeof(char), sizeof(buffer), fb);

     fclose(fp);
     fclose(fb);

     return 0;
}

我正在尝试使用sprintf创建一个名为chunk1的新文件,其中包含文件blah.text的数据(已创建blah.txt)。但即使代码编译正确,它也不会创建新文件。请帮忙。

1 个答案:

答案 0 :(得分:0)

您遇到的问题称为undefined behaviour,因为您在初始化之前使用的是newFileTemp。要解决此问题,请按以下方式对其进行初始化:

newFileTemp = (char*)malloc(100);

或声明如下:

char newFileTemp[100];

原因是sprintf期望newFileTemp有足够的空间来存储它正在格式化的字符串(它不会为你分配)。

此外:

  • 如果您使用malloc请勿忘记free
  • 请勿忘记检查freadfwrite等功能是否成功。

  • 您以后会遇到另一个问题,因为在您调用fwrite时,您总是要写1000字节(sizeof(buffer)是1000字节),即使您的文件较少字节。这是fread的返回值发挥作用的地方(它返回读取的实际字节数):您需要使用该返回值而不是sizeof(buffer)