如何在缓冲区 c 中拆分令牌?
How to split tokens inside a buffer c?
我正在使用 fread 将整个源文件读入缓冲区。由于文件在流或缓冲区中,文件由字节组成,而不是字符串或字符,对吗?那么我如何在缓冲区中拆分字节,以便我可以将标记输出到另一个文件以便对其进行解析?
这是解决这个问题的正确方法,还是有更好的方法?听说读完整个文件才行。
我尝试过使用字符串和字符的方法并找回了奇怪的符号,所以我放弃了它们并开始寻找字节的答案。
FILE *file;
FILE *file2;
char *buffer;
void lex();
void parse();
void parse()
{
file2 = fopen("test1.txt", "w");
printf("been through parse\n\n");
fprintf(file2, "The file called test1.txt contains this text\n\n%s\n\n", buffer);
}
void lex()
{
printf("been through lex \n\n", buffer);
parse();
}
int main()
{
long numbytes;
file = fopen("text.txt", "r");
fseek(file, 0L, SEEK_END);
numbytes = ftell(file);
fseek(file, 0L, SEEK_SET);
buffer = (char*)calloc(numbytes, sizeof(char));
fread(buffer, sizeof(char), numbytes, file);
printf("The file called text.txt contains this text\n\n%s\n\n", buffer);
lex(buffer);
fclose(file);
free(buffer);
return 0;
}
字符串(在 C 中)必须以 NUL
字符 (0) 结尾。 fread
不会向它读取的数据添加任何内容,因此如果您打算按照自己的方式使用 fread
,则需要自己添加 NUL(这意味着您需要确保你已经分配了一个额外的字节来保存它。)
但是,坦率地说,我认为这不是最佳策略。首先,它排除了从 stdin 或管道或任何其他非常规文件(因为它们不可搜索)获取输入的可能性。
通常,您可以使用 fgets
一次一行地读取和标记文件,甚至可以一次读取一个字符,
我正在使用 fread 将整个源文件读入缓冲区。由于文件在流或缓冲区中,文件由字节组成,而不是字符串或字符,对吗?那么我如何在缓冲区中拆分字节,以便我可以将标记输出到另一个文件以便对其进行解析?
这是解决这个问题的正确方法,还是有更好的方法?听说读完整个文件才行。
我尝试过使用字符串和字符的方法并找回了奇怪的符号,所以我放弃了它们并开始寻找字节的答案。
FILE *file;
FILE *file2;
char *buffer;
void lex();
void parse();
void parse()
{
file2 = fopen("test1.txt", "w");
printf("been through parse\n\n");
fprintf(file2, "The file called test1.txt contains this text\n\n%s\n\n", buffer);
}
void lex()
{
printf("been through lex \n\n", buffer);
parse();
}
int main()
{
long numbytes;
file = fopen("text.txt", "r");
fseek(file, 0L, SEEK_END);
numbytes = ftell(file);
fseek(file, 0L, SEEK_SET);
buffer = (char*)calloc(numbytes, sizeof(char));
fread(buffer, sizeof(char), numbytes, file);
printf("The file called text.txt contains this text\n\n%s\n\n", buffer);
lex(buffer);
fclose(file);
free(buffer);
return 0;
}
字符串(在 C 中)必须以 NUL
字符 (0) 结尾。 fread
不会向它读取的数据添加任何内容,因此如果您打算按照自己的方式使用 fread
,则需要自己添加 NUL(这意味着您需要确保你已经分配了一个额外的字节来保存它。)
但是,坦率地说,我认为这不是最佳策略。首先,它排除了从 stdin 或管道或任何其他非常规文件(因为它们不可搜索)获取输入的可能性。
通常,您可以使用 fgets
一次一行地读取和标记文件,甚至可以一次读取一个字符,