2013-09-24 23 views
0

Codeblocks,C我試圖寫字符到.txt文件,使用fwrite。第一對字符得到正確寫入,但在他們後面的文件說:_mcleanup:tos ov。我認爲這可能是一個緩衝過載。有任何想法嗎?C fwrite錯誤:mcleanup

#include <stdio.h> 
#include <stdlib.h> 
#include <sys/stat.h> 
#include <fcntl.h> 

int main() 
{ 
    FILE*p1; 

    p1=fopen("Tomi.txt","w+"); 

    fseek(p1,0,SEEK_SET); 

    // fwrite("Toth Tamas",sizeof(char),30,p1); 

    while(a<10) 
     { 
      fwrite("Toth Tamas",sizeof("Toth Tamas"),1,p1); 

      a++; 

     } 

    return 0; 
} 
+2

要分享的任何代碼? –

+0

我已將代碼放入描述文件中。我試了一下,而且只用了fwrite。 –

+0

這可能不是你的直接問題,但你應該總是用* second *參數1和* third *參數調用'fwrite'(和'fread')等於你想寫的數據量(或讀)。否則,不可能從短寫入(或讀取)中恢復。還要注意'sizeof(char)== 1' *根據定義*,因此'sizeof(char)'是一種糟糕的代碼異味。 – zwol

回答

0

如果我FILE *p1;後立即加入int a = 0;,該程序的while循環版本編譯沒有抱怨,即使最大的警告,並沒有執行我的計算機上的錯誤,即使在Valgrind的。你想在fwrite調用sizeof("Toth Tamas") - 1來防止NUL字節被寫入文件,也許應該有一個\n「Tamas」後面,並看到我以前的評論爲其他小問題,但該代碼似乎大多是好的。

然而,註釋掉的行//fwrite("Toth Tamas",sizeof(char),30,p1);確實有缺陷:字符串常量"Toth Tamas"只有11字節長(包括結束NUL),但你問fwrite寫30個字節,所以將訪問19多個字節超出字符串的末尾,觸發未定義的行爲。在上下文中,人們會期望分段錯誤或寫入文件的垃圾。

而「_mcleanup:tos ov」長度爲17個字節,所以如果這是可執行文件的只讀數據段中的下一個字符串常量(的開頭),那麼顯示爲寫入垃圾是合理的到的文件,我認爲是你說的發生。

+0

非常感謝! –