C fread缓冲区大小-I';我有大量的内存,为什么不把它变大呢?
好吧,我没有学过计算机科学的好处,所以对于那些学过计算机科学的人来说,这可能是一个简单的问题。 基本上正如标题所说,是什么阻止了我创建一个巨大的缓冲区,这个缓冲区比fread()函数使用的文件大小要大得多。 据我所知,fread()将返回成功读取的元素总数,因此此时我可以将缓冲区重新定位回文件大小C fread缓冲区大小-I';我有大量的内存,为什么不把它变大呢?,c,memory,buffer,fread,C,Memory,Buffer,Fread,好吧,我没有学过计算机科学的好处,所以对于那些学过计算机科学的人来说,这可能是一个简单的问题。 基本上正如标题所说,是什么阻止了我创建一个巨大的缓冲区,这个缓冲区比fread()函数使用的文件大小要大得多。 据我所知,fread()将返回成功读取的元素总数,因此此时我可以将缓冲区重新定位回文件大小 #include <stdio.h> #include <stdlib.h> int main () { FILE * pFile; long lSize;
#include <stdio.h>
#include <stdlib.h>
int main () {
FILE * pFile;
long lSize;
char * buffer = NULL;
size_t result = 0;
pFile = fopen ( "test.txt" , "r" );
if (pFile==NULL) {fputs ("File error",stderr); exit (1);}
// memory is cheap!! size:
lSize = 1000000;
buffer = (char*) realloc(buffer, (sizeof(char) * lSize));
if (buffer)
{
result += fread(buffer, sizeof(char), 1, pFile);
}
// copy the file into the buffer:
result = fread (buffer,1,lSize,pFile);
/* file is now loaded in the memory buffer. Now resize buffer */
buffer = (char*) realloc(buffer, (sizeof(char) * result));
// tidy up
printf("\n%s",buffer);
free(buffer);
fclose (pFile);
return 0;
}
#包括
#包括
int main(){
文件*pFile;
长时间lSize;
char*buffer=NULL;
大小\u t结果=0;
pFile=fopen(“test.txt”、“r”);
如果(pFile==NULL){fputs(“文件错误”,stderr);退出(1);}
//内存很便宜!!大小:
lSize=1000000;
buffer=(char*)realloc(buffer,(sizeof(char)*lSize));
if(缓冲区)
{
结果+=fread(缓冲区,大小为(字符),1,pFile);
}
//将文件复制到缓冲区:
结果=fread(缓冲区,1,lSize,pFile);
/*文件现在加载到内存缓冲区。现在调整缓冲区大小*/
buffer=(char*)realloc(buffer,(sizeof(char)*结果));
//收拾
printf(“\n%s”,缓冲区);
自由(缓冲);
fclose(pFile);
返回0;
}
这只是我所说的一个例子。我假定文件大小是
#define INITALLOC 16
#define STEP 8
typedef long ssize_t;
ssize_t readfile(FILE *fp, char *dynbuf)
{
size_t nalloced, n;
int c;
char *tmp;
if ((dynbuf = malloc(INITALLOC)) == NULL)
return -1;
nalloced = INITALLOC;
for (n = 0; (c = fgetc(fp)) != EOF; dynbuf[n++] = c)
if (n == nalloced) {
if ((tmp = realloc(dynbuf, nalloced += STEP) != NULL)
dynbuf = tmp;
else
return -1;
}
return n;
}
因为拥有你所需要的足够多的内存更有意义。当您的文件可能只有5个字节时,分配2KB的堆有什么意义?只有在需要时才重新分配内存更有意义
#define INITALLOC 16
#define STEP 8
typedef long ssize_t;
ssize_t readfile(FILE *fp, char *dynbuf)
{
size_t nalloced, n;
int c;
char *tmp;
if ((dynbuf = malloc(INITALLOC)) == NULL)
return -1;
nalloced = INITALLOC;
for (n = 0; (c = fgetc(fp)) != EOF; dynbuf[n++] = c)
if (n == nalloced) {
if ((tmp = realloc(dynbuf, nalloced += STEP) != NULL)
dynbuf = tmp;
else
return -1;
}
return n;
}
如果整个目标都是速度,那么分配一个巨大的缓冲区,用一个
fread
读取文件,然后只做处理器密集型的事情,那么这种方法就行了
int main (void) {
FILE *pFile;
char *buffer;
size_t result;
struct stat statbuf;
if (!stat("test.txt", &statbuf)
|| !(pFile = fopen("test.txt", "r")) {fputs ("File error", stderr); return (1);}
// memory is cheap!!
if ((buffer= malloc(statbuf.st_size)==0) {fputs ("Memory error", stderr); return (1);}
result= fread(buffer, 1, lSize, pFile);
fclose (pFile);
if (result != statbuf.st_size) {fputs ("Read error", stderr); return (1);}}
// now use lots of cycles...
free(buffer);
return 0;
}
如果整个目标都是速度,那么分配一个巨大的缓冲区,用一个
fread
读取文件,然后只做处理器密集型的事情,那么这种方法就行了
int main (void) {
FILE *pFile;
char *buffer;
size_t result;
struct stat statbuf;
if (!stat("test.txt", &statbuf)
|| !(pFile = fopen("test.txt", "r")) {fputs ("File error", stderr); return (1);}
// memory is cheap!!
if ((buffer= malloc(statbuf.st_size)==0) {fputs ("Memory error", stderr); return (1);}
result= fread(buffer, 1, lSize, pFile);
fclose (pFile);
if (result != statbuf.st_size) {fputs ("Read error", stderr); return (1);}}
// now use lots of cycles...
free(buffer);
return 0;
}
基本上,什么都没有。事实上,为什么要费心去realloc它呢?好吧,只是为了为下一个文件释放内存,基本上我可以获取所有可用的内存加载myfile,然后realloc来释放备份内存。我想我真正想知道的是,这种形式的贪婪编程是正确的方法吗?缓冲区只是一个缓冲区,你可以选择如何分配它。通常,您会使用一个合理的值。为什么要使用巨大的价值?显然没有任何好处。@Shauny好的,如果应用程序要打开更多文件,当然可以。您的示例应用程序只打开了一个。@terencehill显然有。如果可以避免realloc调用,那么就可以避免内存分配和潜在的大容量数据拷贝。实际上,什么都没有。事实上,为什么要费心去realloc它呢?好吧,只是为了为下一个文件释放内存,基本上我可以获取所有可用的内存加载myfile,然后realloc来释放备份内存。我想我真正想知道的是,这种形式的贪婪编程是正确的方法吗?缓冲区只是一个缓冲区,你可以选择如何分配它。通常,您会使用一个合理的值。为什么要使用巨大的价值?显然没有任何好处。@Shauny好的,如果应用程序要打开更多文件,当然可以。您的示例应用程序只打开了一个。@terencehill显然有。如果可以避免realloc调用,就可以避免内存分配和潜在的大容量数据复制。“只有在需要时才重新分配内存才更有意义。”-好的,因此如果您首先分配一个巨大的缓冲区,您可能根本不需要重新分配。@MartinJames但是分配太多内存会浪费内存。这就是我所做的@terencehillSorry!!!我的错,是你编辑的还是我真的瞎了?删除了错误的comment@terencehill我想你在我编辑它的时候就发表了评论,按下编辑按钮“只在需要时重新分配内存更有意义。”-好的,如果你先分配一个巨大的缓冲区,你可能根本不需要重新分配。@MartinJames,但是分配太多的内存会浪费内存。这就是我所做的@terencehillSorry!!!我的错,是你编辑的还是我真的瞎了?删除了错误的comment@terencehill我想你在我编辑它并按下编辑按钮后就发表了评论