gpt4 book ai didi

c - 在 C 中将文件拆分为 n 个较小的文件

转载 作者:行者123 更新时间:2023-12-01 23:43:32 25 4
gpt4 key购买 nike

我正在编写一个程序,将一个文件分成 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com