C读取文件

File read with C

我需要用C语言读取下面的文件。我尝试使用以下代码:

FILE *f;
char  fileExtract[100];

if ( (f = fopen("input.txt", "r")) == NULL )
{
    error_disp((char *)"input.txt open error!");
}
else
{
    f= fopen("input.txt","r+");

    long i  = 0;
    while((fileExtract[i]=getc(f))!=EOF)
    {
        i++;
    }

文件内容如下。我编写的代码一次读取单个字符,但 我想让我的程序一次读取一个块我该怎么做。因为我的完整文件很大,所以当程序读取到最后时,内存管理出现问题。 这是块之一:

{{{"aaabbcca", "abbccaaa"}, {"aaaccbbb", "baacccbb"}, {"abbbaaac", "cccbbaaa"}, {"aacccbca", "abcbbbaa"}},

这是文件的内容。

{{{"aaabbcca", "abbccaaa"}, {"aaaccbbb", "baacccbb"}, 
  {"abbbaaac", "cccbbaaa"}, {"aacccbca", "abcbbbaa"}}, 
 {{"aaabbcca", "abbccaaa"}, {"aaaccbbb", "baacccbb"}, 
  {"abbbaaac", "cccbbabb"}, {"aacccbca", "abcbbbaa"}}, 
 {{"aaabbcca", "abbccaaa"}, {"aaaccbbb", "baacccbb"}, 
  {"cbbbaaac", "cccbbaaa"}, {"aacccbca", "abcbbbaa"}}, 
 {{"aaabbcca", "abbccaaa"}, {"aaaccbbb", "baacccbb"}, 
  {"cbbbaaac", "cccbbabb"}, {"aacccbca", "abcbbbaa"}}, 
 {{"aaabbcca", "abbccaaa"}, {"aaaccbbb", "baacccbc"}, 
  {"abbbaaac", "cccbbaaa"}, {"aacccbca", "abcbbbaa"}}, 
 {{"aaabbcca", "abbccaaa"}, {"aaaccbbb", "baacccbc"}, 
  {"abbbaaac", "cccbbabb"}, {"aacccbca", "abcbbbaa"}}, 
 {{"aaabbcca", "abbccaaa"}, {"aaaccbbb", "baacccbc"}, 
  {"cbbbaaac", "cccbbaaa"}, {"aacccbca", "abcbbbaa"}}, 
 {{"aaabbcca", "abbccaaa"}, {"aaaccbbb", "baacccbc"}, 
  {"cbbbaaac", "cccbbabb"}, {"aacccbca", "abcbbbaa"}}, 
 {{"aaabbcca", "abbccaaa"}, {"ccaccbbb", "baacccbb"}, 
  {"abbbaaac", "cccbbaaa"}, {"aacccbca", "abcacccb"}}, 
 {{"aaabbcca", "abbccaaa"}, {"ccaccbbb", "baacccbb"}, 
  {"abbbaaac", "cccbbaaa"}, {"aacccbca", "abcbbbaa"}}, 
 {{"aaabbcca", "abbccaaa"}, {"ccaccbbb", "baacccbb"}, 
  {"cbbbaaac", "cccbbaaa"}, {"aacccbca", "abcacccb"}}, 
 {{"aaabbcca", "abbccaaa"}, {"ccaccbbb", "baacccbb"}, 
  {"cbbbaaac", "cccbbaaa"}, {"aacccbca", "abcbbbaa"}}, 
 {{"aaabbcca", "abbccaaa"}, {"ccaccbbb", "baacccbc"}, 
  {"abbbaaac", "cccbbaaa"}, {"aacccbca", "abcacccb"}}, 
 {{"aaabbcca", "abbccaaa"}, {"ccaccbbb", "baacccbc"}, 
  {"abbbaaac", "cccbbaaa"}, {"aacccbca", "abcbbbaa"}}, 
 {{"aaabbcca", "abbccaaa"}, {"ccaccbbb", "baacccbc"}, 
  {"cbbbaaac", "cccbbaaa"}, {"aacccbca", "abcacccb"}}, 
 {{"aaabbcca", "abbccaaa"}, {"ccaccbbb", "baacccbc"}, 
  {"cbbbaaac", "cccbbaaa"}, {"aacccbca", "abcbbbaa"}},

我写的代码一次读取整个文件 不,它没有。它一次读取一个 getc() 文件,一次只读取一个字符。

但我想让我的程序一次只读取一个块 "read one block at a time" 是什么意思?我假设你的意思是一些被 {}.

包围的内容

没有办法那样阅读。您可以(产生幻觉)一次读取一个字符,一次读取一个字符串,一次读取一行,或者一次读取一个预定义的字节数。

根据您输入的具体大小,您最好一次读取整个文件,然后对内存中的缓冲区进行操作以找到您要处理的子部分,或者至少处理文件大块并做同样的事情。 fread() 将允许您从文件中读取任意数量的数据。

您需要某种状态机,这是一个简单的状态机

  • 忽略空格。
  • 当它发现关闭"}"组时停止,它不检查完整性。

#include <stdio.h>
#include <ctype.h>

int main(int argc, char *argv[])
{
    FILE *file;
    int current;
    char buffer[200];
    int state;
    int count;
    file = fopen("file.txt", "r");
    if (file == NULL)
        return -1;
    count = 0;
    state = 0;
    while (((current = fgetc(file)) != EOF) && (count < 200))
    {
        if (isspace((unsigned char) current) != 0)
            continue;
        if (current == '{')
            state += 1;
        else if (current == '}')
            state -= 1;
        if ((count > 0) && (state == 1))
            break;
        buffer[count++] = current;
    }
    buffer[count] = '[=10=]';

    fprintf(stderr, "%s\n", buffer);
    return 0;
}

你可以用这个例子编写一个函数,并根据需要通过“blocks”检索文件,还有很多你可能想要检查的。例如,如果它们在双引号内,您可能想要允许空格。但我认为这会给你想法。