嘿,让我说我得到一个文件作为第一个命令行参数。
int main(int argc, char** argv) {
unsigned char* fileArray;
FILE* file1 = fopen(argv[1], "r");
}
现在我怎样才能将这个文件(char by char)读入char* fileArray
?
基本上我怎么能在{I}知道我需要多大的FILE*
char*
转换为char*
我知道一个可能的解决方案是使用缓冲区,但我的问题是我正在处理可能有超过900000个字符的文件,并且看不到它适合制作那么大的缓冲区。
答案 0 :(得分:2)
如果仅使用“真实”文件(非流媒体,设备等),您可以使用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和阅读。 但是,由于file1可能会在此期间发生变化,因此您仍需确保不要超出您的malloced大小。
答案 1 :(得分:1)
您可以采取以下几种方法:
malloc
realloc
处理任意大小(当您读取位时)。1号很容易:
static char buff[900001]; // or malloc/free of 900000
count = fread (buff, 1, 900001, fIn);
if (count > 900000) // problem!
数字2可能是最好的方法,除非你绝对需要一次在内存中的整个文件。例如,如果您的程序计算单词数,它可以按顺序处理文件几个K.
3号,您可以维护buffer
,used
和max
变量。最初将max
设置为50K并将buffer
分配为该大小。
然后尝试将一个10K块读入固定缓冲区tbuff
。将当前used
和读取的字节数添加到tbuff
,如果大于max
,请执行realloc
以将buffer
再增加50K (同时调整max
)。
然后将tbuff
追加到buffer
,调整used
,冲洗并重复。请注意,所有这些值(10K,50K等)仅为示例。根据您的需要,您可以使用不同的值。