如何读取大输入 - C中的8MBdata

时间:2016-03-04 03:35:52

标签: c arrays input

我有一个问题,我必须从输入文件中读取大数据(8mb)。我尝试给出数组的大小。有没有任何有效的方法可以重写代码

#include <stdio.h>
#include <stdlib.h>
int main()
 {

FILE *f;
char msg[9000000]=" ";  
int i=0;
f=fopen("file.txt","r");
while((msg[i]=fgetc(f))!=EOF){
        i++;
        }
 printf("\nThe data from the file is :%s\n",msg);
fclose(f);
return 0;
 }

2 个答案:

答案 0 :(得分:0)

在这种情况下,您只需编写您所读取的内容而不将所有内容保存在内存中。

#include <stdio.h>
#include <stdlib.h>
int main(void)
{

    FILE *f;
    int msg;
    int inputExists = 0;
    f=fopen("file.txt","r");
    if(f == NULL){
        perror("fopen");
        return 1;
    }
    printf("\nThe data from the file is :");
    while((msg=fgetc(f))!=EOF){
        putchar(msg);
        inputExists = 1;
    }
    if(!inputExists) putchar(' ');
    printf("\n");
    fclose(f);
    return 0;
}

答案 1 :(得分:0)

存储在堆栈上的非静态局部变量(通常,但C标准不要求)。在大多数系统中,该堆栈的大小相当有限,通常约为1 MB甚至更低。

因此,您应该将数据存储在堆中或静态内存中的其他位置。使用堆是首选方式:

#include <stdio.h>
#include <stdlib.h>
#define MAX (8 * 1024 * 1024)
int main () {
  char * data = malloc(MAX);
  // add error checks
  int in;
  size_t position = 0;
  while ((in = fgetc(stdin)) != EOF && position < MAX) {
    data[position++] = in & 0xFF;
  }
  // Note: data is NOT a string, no null termination
  // also check for errors
  free(data);
  return 0;
}

有两点需要注意:我还在检查缓冲区是否会溢出。这非常重要,您应该确保您读取和写入的每个缓冲区。

其次,正如任何引用都会告诉您的那样,fgetc的返回值为int。这很重要,因为EOF可以是char无法表示的值。