2013-02-09 47 views
0

我一直在嘗試在C/C++中創建一個程序,該程序會創建文件,直到進程停止。 文件名從0開始並按照一個算術序列。無法創建超過1000個文件(C++程序)

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

long cifre(long x) //returns the number of digits a number has 
{ 
    int nr = 0; 
    while (x != 0) 
    { 
     x = x/10; 
     nr++; 
    } 
    return nr; 
} 

int main() 
{ 
    long i=0; 
    FILE* g; 
    char* v; 
    char buffer[1025]; 
    int j=0; 

    for (j=0;j<1024;j++) 
     buffer[j] = 'x'; 

    while (1) 
    { 
     v = (char*)malloc(cifre(i)+10); 
     snprintf(v,sizeof(v),"%ld",i); 
     g = fopen(v,"w"); 
     fprintf(g,"%s",buffer); 
     free(v); 
     fclose(g); 
     i++; 
    }  
    return 0; 
} 

的問題是,該方案僅創建1000個文件。

+0

什麼是你的文件系統?你在使用哪種操作系統? – 2013-02-09 10:18:46

+0

這確實是你的文件系統的問題。我已經運行你的程序一段時間,然後通過^ C終止它。我得到:'ls | wc -l 378872' - 遠遠超過1000個文件。順便說一句,你不會'緩衝區[1024] = 0',所以它的工作原理錯了! – 2013-02-09 10:23:11

+0

@PatrickB。 ext4,Ubuntu 12.10 – 2013-02-09 10:37:55

回答

3

調用sprintf時的sizeof(v)是char指針的大小,在你的情況下可能是4,這意味着格式化的字符串最多包含3個字符,或者包含0到999之間的數字。您使用的相同的長度來分配存儲器:

size_t len = cifre(i)+10; 
    v = (char*)malloc(len); 
    snprintf(v,len,"%ld",i); 
+0

好的,我會試試。 – 2013-02-09 10:34:04

1

snprintf(v,sizeof(v)沒有多大意義,因爲sizeof(v)返回指針的大小(vchar*),而不是動態分配的數組的大小。因此snprintf()僅限於打印sizeof(v) -1個字符或3位數字和NUL字符串終止符。 3位數字給你的值從000到999,正好爲1000.