用C语言读取文件
我需要使用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))!=
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;
}