用C语言读取文件

用C语言读取文件,c,file,readfile,C,File,Readfile,我需要使用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))!=

我需要使用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++;
    }
文件内容包括在下面。我编写的代码一次只能读取一个字符,但我想让我的程序一次读取一个块。由于我的完整文件很大,所以当程序读取到最后时,管理内存存在问题。 这是其中一个模块:

{{{“aaabcca”,“abbcaaa”},{“aaccbbb”,“bacccbb”}, {“abbbaac”,“cccbbaaa”},{“aacccbca”,“abcbbbaa”},

这是文件的内容

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

但是我想让我的程序一次只读一个块 “一次读一个块”是什么意思?我想你指的是一些被
{
}
包围的内容

没有这样的阅读方法。你可以(有这样的错觉)一次读一个字符,或者一次读一个字符串,或者一次读一行,或者一次读一个预定义的字节数


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

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

  • 忽略空白
  • 当它发现一个组的关闭
    “}”
    时停止,它不会检查完整性

#包括
#包括
int main(int argc,char*argv[])
{
文件*文件;
电流;
字符缓冲区[200];
int状态;
整数计数;
file=fopen(“file.txt”、“r”);
if(file==NULL)
返回-1;
计数=0;
状态=0;
而(((当前=fgetc(文件))!=EOF)和&(计数<200))
{
如果(isspace((无符号字符)当前)!=0)
继续;
如果(当前=='{')
状态+=1;
else if(当前=='}')
状态-=1;
如果((计数>0)和&(状态==1))
打破
缓冲区[计数++]=当前;
}
缓冲区[计数]='\0';
fprintf(stderr,“%s\n”,缓冲区);
返回0;
}

您可以使用这个示例编写一个函数,并按照您的意愿通过“块”检索文件,您可能还需要检查更多内容。例如,如果空格在双QOUTE范围内,可能需要允许空格。但是我想这会给你一个想法。

为什么
fopen
两次打开文件?实际问题是什么?我不理解你的问题。您不是一次读取整个文件,而是一次读取一个字符。如果您一次只想处理一个块,为什么不查看已读取的字符,以便在到达块末尾时查看?注意,您应该使用
int
存储
fgetc()
的返回值。是的,一次只读取此部分{{{{“aaabbcca”,“abbcaaa”},{“aaccbbb”,“bacccbb”},{“abbaaaac”,“ccbbaa”}{“aacccbca”,“abcbbbaa”},好吧,我明白你的意思,所以我的答案是——你不能这么做(除非你提供自己的函数来解析你的数据)。我有几个文件,有些是6MB,有些是8Mb甚至更多。你能建议我如何给出动态内存大小吗?即使我以与上面相同的方式读取该文件。每次读取如此大的文件一个字节将带来巨大的性能损失!但要确定文件大小,一旦打开,你可以
fseek(fp,0,SEEK_END);
查找文件的末尾,
long size=ftell(fp);
查找您所在的位置(即大小),以及
rewind(fp);
返回开始。如果您计划在知道文件大小并分配缓冲区后读取整个文件,您可以使用
fread(buffer,1,size,fp)执行此操作;
{{{"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"}},
#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] = '\0';

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