fread buffer size - 我有很多内存,为什么不让它变大呢?
fread buffer size - I've loads of memory so why not make it huge?
好吧,我没有学过计算机科学,所以对于那些学过计算机科学的人来说,这可能是一个简单的问题。
基本上正如标题所说,是什么阻止我创建一个比 fread() 函数使用的文件大小大得多的大缓冲区。
据我了解,fread() 将 return 成功读取的元素总数,因此此时我可以将缓冲区重新分配回文件大小。
#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;
}
这只是我所说内容的一个示例。我假设文件大小 < 缓冲区大小
因为根据需要拥有尽可能多的内存更有意义。当您的文件可能只有 5 个字节时,分配 2k B 的堆有什么意义?仅在需要时重新分配内存更有意义。
#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;
}
如果整个 objective 是速度,那么分配一个巨大的缓冲区并用一个 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() 函数使用的文件大小大得多的大缓冲区。 据我了解,fread() 将 return 成功读取的元素总数,因此此时我可以将缓冲区重新分配回文件大小。
#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;
}
这只是我所说内容的一个示例。我假设文件大小 < 缓冲区大小
因为根据需要拥有尽可能多的内存更有意义。当您的文件可能只有 5 个字节时,分配 2k B 的堆有什么意义?仅在需要时重新分配内存更有意义。
#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;
}
如果整个 objective 是速度,那么分配一个巨大的缓冲区并用一个 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;
}