2013-02-09 45 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.