为什么我的代码无法使用 sprintf 和 fopen 打开新文件?

Why wont my code work to open a new file using sprintf and fopen?

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 已创建)。但即使代码编译正确,它也不会创建新文件。请帮忙。

您遇到的情况称为 undefined behaviour,因为您在初始化之前使用 newFileTemp。要解决此问题,请像这样对其进行初始化:

newFileTemp = (char*)malloc(100);

或者这样声明:

char newFileTemp[100];

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

还有:

  • 如果你使用 malloc 别忘了 free.

  • 不要忘记检查 fread and fwrite.

    等功能是否成功
  • 稍后您会遇到另一个问题,因为在调用 fwrite 时,您总是试图写入 1000 字节(sizeof(buffer) 是 1000 字节),即使您的文件有更少的字节。这是 fread 的 return 值发挥作用的地方(它 return 是读取的实际字节数):您需要使用该 return 值而不是 sizeof(buffer).