Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C fread缓冲区大小-I';我有大量的内存,为什么不把它变大呢?_C_Memory_Buffer_Fread - Fatal编程技术网

C fread缓冲区大小-I';我有大量的内存,为什么不把它变大呢?

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;

好吧,我没有学过计算机科学的好处,所以对于那些学过计算机科学的人来说,这可能是一个简单的问题。 基本上正如标题所说,是什么阻止了我创建一个巨大的缓冲区,这个缓冲区比fread()函数使用的文件大小要大得多。 据我所知,fread()将返回成功读取的元素总数,因此此时我可以将缓冲区重新定位回文件大小

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

这只是我所说的一个例子。我假定文件大小是,因为拥有所需的内存更有意义。当您的文件可能只有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;
}

因为拥有你所需要的足够多的内存更有意义。当您的文件可能只有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我想你在我编辑它并按下编辑按钮后就发表了评论