【问题标题】:Why wont my code work to open a new file using sprintf and fopen?为什么我的代码不能使用 sprintf 和 fopen 打开一个新文件?
【发布时间】:2017-09-23 23:30:30
【问题描述】:
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)。但即使代码编译正确,它也不会创建新文件。请帮忙。

【问题讨论】:

  • 如果您能解释一下它的作用,那就太好了。
  • 请使用snprintf() 而不是sprintf()。 (在这种情况下,它可能会指出您没有缓冲区大小可以给它...)

标签: c printf fopen fwrite fread


【解决方案1】:

您所遇到的称为undefined behaviour,因为您在初始化之前使用了newFileTemp。要纠正这个问题,请像这样初始化它:

newFileTemp = (char*)malloc(100);

或者这样声明:

char newFileTemp[100];

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

还有:

  • 如果您使用malloc,请不要忘记free

  • 别忘了检查freadfwrite等函数是否成功。

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

【讨论】:

  • 这是 C: no new.
  • 谢谢,没有注意到他已将其标记为 C。已修复。
  • 我不得不在严格意义上同意这一点,但是以未定义的行为角度引导它似乎掩盖了关键点,即sprintf() 不仅需要它的第一个参数是char *,但要求它是指向现有char 数组的指针[in],该数组大到足以接收“打印”的数据。 sprintf() 不仅分配空间并将其分配给指针,它不能
猜你喜欢
  • 2021-09-01
  • 2010-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-24
  • 1970-01-01
  • 1970-01-01
  • 2022-01-18
相关资源
最近更新 更多