我正在编写一个程序,将一个文件分成 N 个较小的部分 (几乎)大小相等。所以这是我的代码:
FILE * fp = fopen(file,"r");
long aux;
long cursor = 0;
long blockSize = 1024000; //supose each smaller file will have 1 MB
long bytesLimit = blockSize;
for( i = 0 ; i < n ; i++) {
FILE * fp_aux = fopen( outputs[i] , "w"); //outputs is an array of temporary file names
while(cursor < bytesLimit) { //here occurs the infinite loop
fscanf(fp,"%lu\n",&aux);
fprintf(fp_aux,"%lu\n",aux);
cursor = ftell(fp);
}
fclose(fp_aux);
bytesLimit = bytesLimit + blockSize;
}
//here add some more logic to get the remaining content left in the main file
如果我想将文件分成两部分或三部分,代码可以工作,但是当我尝试将它分成 10 部分时,fscanf
锁定读取相同的数字并保持无限循环那里。
我的输入文件的格式为“%lu\n”,如下所示:
1231231
4341342
4564565
...
最佳答案
如果拆分文件 是重点,那么请简化您的方法。因为您的帖子表明您正在使用文本文件,所以假设它包含带有标点符号、数字、换行等的单词。对于这种类型的内容,可以使用 fgets()/fputs() 将其解析为行。这将允许您从一个大文件中读取行,随时跟踪累积大小,并将行写入多个较小的文件...
一些简单的步骤:
1)确定待分割文件的文件大小
2) 设置所需的小文件大小。
3)打开大文件
4) 在循环中使用 fgets/fputs,打开和关闭文件以拆分内容,使用累积大小作为拆分点。
5) 清理。 (关闭文件等)
下面是一个示例,将说明这些步骤。无论文本内容如何,这都会按大小拆分大型文本文件。 (我用了一个130K大小的文本文件,把它分成5k个大小的段
#define SEGMENT 5000 //approximate target size of small file
long file_size(char *name);//function definition below
int main(void)
{
int segments=0, i, len, accum;
FILE *fp1, *fp2;
long sizeFile = file_size(largeFileName);
segments = sizeFile/SEGMENT + 1;//ensure end of file
char filename[260]={"c:\\play\\smallFileName_"};//base name for small files.
char largeFileName[]={"c:\\play\\largeFileName.txt"};//change to your path
char smallFileName[260];
char line[1080];
fp1 = fopen(largeFileName, "r");
if(fp1)
{
for(i=0;i<segments;i++)
{
accum = 0;
sprintf(smallFileName, "%s%d.txt", filename, i);
fp2 = fopen(smallFileName, "w");
if(fp2)
{
while(fgets(line, 1080, fp1) && accum <= SEGMENT)
{
accum += strlen(line);//track size of growing file
fputs(line, fp2);
}
fclose(fp2);
}
}
fclose(fp1);
}
return 0;
}
long file_size(char *name)
{
FILE *fp = fopen(name, "rb"); //must be binary read to get bytes
long size=-1;
if(fp)
{
fseek (fp, 0, SEEK_END);
size = ftell(fp)+1;
fclose(fp);
}
return size;
}
关于c - 在 C 中将文件拆分为 n 个较小的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30222271/