2017-09-23 131 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()'不僅*不分配空間並將其分配給指針,它*不能*。 –

相關問題