我需要编写C代码来读取大文件。以下是代码:
int read_from_file_open(char *filename,long size)
{
long read1=0;
int result=1;
int fd;
int check=0;
long *buffer=(long*) malloc(size * sizeof(int));
fd = open(filename, O_RDONLY|O_LARGEFILE);
if (fd == -1)
{
printf("\nFile Open Unsuccessful\n");
exit (0);;
}
long chunk=0;
lseek(fd,0,SEEK_SET);
printf("\nCurrent Position%d\n",lseek(fd,size,SEEK_SET));
while ( chunk < size )
{
printf ("the size of chunk read is %d\n",chunk);
if ( read(fd,buffer,1048576) == -1 )
{
result=0;
}
if (result == 0)
{
printf("\nRead Unsuccessful\n");
close(fd);
return(result);
}
chunk=chunk+1048576;
lseek(fd,chunk,SEEK_SET);
free(buffer);
}
printf("\nRead Successful\n");
close(fd);
return(result);
}
我在这里遇到的问题是,只要传递的参数(size参数)小于264000000字节,它似乎能够读取。每个周期都会增加chunk变量的大小。
当我传递264000000字节或更多时,读取失败,即:根据检查所用的内容,read返回-1。
有人能指出为什么会发生这种情况吗?我是在正常模式下使用cc编译的,而不是使用DD64。
size
作为大小。然后,你读取缓冲区中的信息,使用固定大小而不考虑读入缓冲区的分配大小。想想如果size
小于250k会发生什么。其次,由于文件是新打开的,所以你不需要寻找开头。第三,你然后寻找size
,但是size
是文件中的记录数还是字节数?在分配缓冲区时,你使用了不同的size
。 - Some programmer duderead
将自动推进文件中的位置,您不需要每次都进行搜索。第六,在读取时,您检查错误,但不检查文件结束。read
在文件结束时返回0
。 - Some programmer duderead
。使用例如mmap
的解决方案可能更为有效,特别是当你按顺序读取文件时。 - Some programmer dude