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”检索文件,还有很多你可能想要检查的。例如,如果它们在双引号内,您可能想要允许空格。但我认为这会给你想法。
我需要用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”检索文件,还有很多你可能想要检查的。例如,如果它们在双引号内,您可能想要允许空格。但我认为这会给你想法。