繁体   English   中英

如何在C中读取大文本文件

[英]How to read large text file in c

我正在尝试使用链接列表存储一个大文件的每一行(从1 GB到70 GB),但这就是问题所在,我不能这样做,因为它会溢出我的RAM并迫使Windows停止程序执行。

我写的函数是这些:

struct Word {
    char word[13];
};

typedef struct Nodo {
    struct Word word;
    struct Nodo *next;
} TNodo;

typedef TNodo *Nodo;

void NewWord(Nodo *p, struct Word s) {
    Nodo temp;
    temp = (Nodo)malloc(sizeof(TNodo));
    temp->word = s;
    temp->next = *p;
    *p = temp;
}

void LoadList(Nodo *p) {
    FILE *f;
    struct Word s;
    char *buffer = malloc(sizeof(struct Word));

    if (!(f= fopen("wordlist.txt", "r"))) {
        fclose(f);
        exit(1);
    }

    while (fgets(buffer, sizeof(struct Word), f)) {
        if (sscanf(buffer,"%s", s.word) == 1) {
             NewWord(p, s);
        }
    }
    fclose(f);
    free(buffer);
}

有没有更好的方法来处理非常大的文本文件中的数据(例如删除文件行)而不存储它们?

我尝试读取的文本文件具有以下简单结构:

Word
Worf
Worg

据我了解,我发现以下两种方法比其他方法更好:

1)将较大的块读取到较大的内存缓冲区中,然后从该缓冲区中解析出数据。

2)另一种方法可能是改为对文件进行内存映射,然后操作系统会将文件放入您的进程虚拟内存映射,因此您可以像从内存中读取一样进行读取。

我根据您的回答更改了功能,现在功能NewWord只是将单词打印到第二个文件中,根据功能step1()step2()跳过了不必要的单词。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define SIZE 67

char  letters[SIZE] = {'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z',
                        'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z',
                        '.','_','1','2','3','4','5','6','7','8','9','0','!','@','$'};


struct Word
{
  char word[13];
};



_Bool step1(char * word)
{
for(int i = 0; i < SIZE; i++)
{
for(int j = 0, c = 0; j < strlen(word); j++)
  {
  if(word[j] == letters[i])
  {
    c++;
    if(c > 3)
    {
      return 1;
    }
  }

  }
}
return 0;

}


_Bool step2(char * word)
{
  for(int i = 0; i < SIZE; i++)
  {
  for(int j = 0; j < strlen(word); j++)
    {
    if(word[j] == letters[i] && word[j+1] == letters[i] && word[j+2] == letters[i])
    {
        return 1;
    }

    }
  }
  return 0;


}


void NewWord(FILE *f, struct Word s)
{
if(step1(s.word ) == 1 || step2(s.word) == 1)
 return;

fprintf(f, "%s\n", s.word);

}


void LoadList()
{
  FILE * f1;
  FILE * f2;
 struct Word s;
  char * buffer = malloc(sizeof(struct Word));

  if(!(f1= fopen("wordlist.txt", "r")))
  {
    fclose(f1);
    exit(1);
  }

  if(!(f2 = fopen("bb.txt", "w")))
  {
    fclose(f2);
    exit(1);
  }


 while(fgets(buffer, sizeof(struct Word), f1))
  {
    if(sscanf(buffer,"%s", s.word) == 1)
     {
       NewWord(f2, s);
     }

  }

fclose(f1);
fclose(f2);
free(buffer);

}



int main()
{
 LoadList();

exit(0);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM