嘿,假设我得到一个文件作为第一个命令行参数。
int main(int argc, char** argv) {
unsigned char* fileArray;
FILE* file1 = fopen(argv[1], "r");
}现在,如何将文件逐个读取到char* fileArray中
基本上,在我知道FILE*需要多大之前,如何将char*转换为char*
我知道一种可能的解决方案是使用缓冲区,但我这里的问题是,我正在处理可能超过900000个字符的文件,并且认为对于如此大的缓冲区是不合适的。
发布于 2010-10-26 15:20:25
如果只有“真实”文件(不是流、设备等),则可以使用stat/fstat或类似于
int retval=fseek(file1,0,SEEK_END); // succeeded if ==0 (file seekable, etc.)
long size=ftell(file1); // size==-1 would be error
rewind(file1);来预先获取文件的大小。然后你就可以使用malloc和read了。但是,由于file1可能会在此期间发生变化,因此您仍然必须确保读取的内容不会超出您的错误大小。
发布于 2010-10-26 15:02:41
您可以采用以下几种方法:
malloc与realloc配合使用来处理任意大小(在您读取位时)。第一个很简单:
static char buff[900001]; // or malloc/free of 900000
count = fread (buff, 1, 900001, fIn);
if (count > 900000) // problem!第二种方法可能是最好的方法,除非您确实需要立即在内存中存储整个文件。例如,如果您的程序计算了字数,它可以一次按顺序处理文件几千字。
第三,你可以维护一个buffer,used和max变量。最初将max设置为50K,并将buffer分配为该大小。
然后尝试将一个10K区块读取到固定的缓冲区tbuff。将当前的used和读取到tbuff中的字节数相加,如果该值大于max,则执行realloc以将buffer再增加50K (同时调整max )。
然后将tbuff附加到buffer,调整used,漂洗并重复。请注意,所有这些值(10K、50K等)都只是示例。根据您的需要,可以使用不同的值。
https://stackoverflow.com/questions/4021361
复制相似问题