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;
 }