2017-09-23 93 views
0
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已经创建)的数据。但即使代码编译正确,它也不会创建一个新文件。请帮忙。为什么我的代码不能使用sprintf和fopen打开一个新文件?

+0

如果你解释了它的功能,那将会很棒。 – nicomp

+0

请使用'snprintf()'而不是'sprintf()'。 (在这种情况下,它可能指出你没有缓冲区大小来给它...) –

回答

0

您遇到的问题称为undefined behaviour,因为您在初始化之前使用的是newFileTemp。要解决此问题,初始化这样的:

newFileTemp = (char*)malloc(100); 

或声明它是这样的:

char newFileTemp[100]; 

的原因是sprintf预计newFileTemp有被分配用于存储被格式化字符串足够的空间(它不会为你分配)。

另外:

  • 如果使用malloc不要忘记free
  • 不要忘记检查功能的成功,如freadfwrite

  • 你会因为你的电话以后还有另一个问题fwrite你试图写总是1000字节(sizeof(buffer)是1000个字节),即使你的文件有较少的字节。这是fread的返回值起作用的地方(它返回读取的实际字节数量):您需要使用该返回值而不是sizeof(buffer)

+1

这是C:没有'new'。 –

+0

谢谢,没有注意到他把它标记为C. Fixed。 – MondKin

+0

我必须严格意义上同意这一点,但通过引入未定义的行为角度,它似乎埋葬了关键点,即'sprintf()'不仅仅要求其第一个参数是'char * ',但它要求它是一个指向[现有的'char'数组的大小足以接收“打印”数据的指针。 'sprintf()'不仅*不分配空间并将其分配给指针,它*不能*。 –

相关问题