我需要读取文件并将它们存储在mainbuff和mainbuff2中.
我只能使用系统调用像open(),read(),write()等等.
我不想把它们存放在堆栈中,如果它会非常大的话呢?堆分配更好.
这段代码有效:
...
char charbuf;
char *mainbuff1=malloc(100);
char *mainbuff2=malloc(100);
while (read(file1, &charbuf, 1)!=0)
mainbuff1[len++]=charbuf;
while (read(file2, &charbuf, 1)!=0)
mainbuff2[len2++]=charbuf;
...
Run Code Online (Sandbox Code Playgroud)
但是mainbuff只有100个字符.更好的解决方案是在计算文件中的字符后分配mainbuff,如下所示:
...
char charbuf;
while (read(file1, &charbuf, 1)!=0)
len++;
while (read(file2, &charbuf, 1)!=0)
len2++;
char *mainbuff1=malloc(len);
char *mainbuff2=malloc(len2);
...
Run Code Online (Sandbox Code Playgroud)
然后再次重复while循环并将字节读入mainbuff.
但是2个循环(第一个将读取和计数,第二个将读取)对于大型文件将是无效且缓慢的.需要在一个或更高效的其他方面做到这一点.请帮忙!不知道!
您可以使用fstat获取文件大小而不是读取两次.
#include <sys/stat.h>
int main() {
struct stat sbuf;
int fd = open("filename", O_RDWR);
fstat(fd, &sbuf);
char *buf = malloc(sbuf.st_size + 1);
}
Run Code Online (Sandbox Code Playgroud)
但是,实际上,担心效率的时间是在它工作得太慢之后.
如果这确实是需要优化的地方,那么您真正应该优化的是以下两件事:
read()和的号码write()对于100到1000字节的小缓冲区,没有理由使用malloc()等,只需在堆栈上分配缓冲区,它就会是最快的.当然,除非你想从函数返回指向这些缓冲区的指针,在这种情况下你可能应该使用malloc().否则,您应该考虑使用全局/静态数组而不是动态分配的数组.
至于I/O调用,调用read()并write()使用整个缓冲区大小.不要让它们读取或写入单个字节.转换到内核和返回确实有成本.
此外,如果您希望在RAM中使用相当大的文件,请考虑使用文件映射.