如何在缓冲区c内拆分令牌?

时间:2019-04-25 00:30:57

标签: c buffer

我正在使用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;
}

1 个答案:

答案 0 :(得分:1)

字符串(在C中)必须以NUL字符(0)结尾。 fread不会在读取的数据中添加任何内容,因此,如果您要以自己的方式使用fread,则需要自己添加NUL(这意味着您需要确保您已经分配了一个额外的字节来保存它。)

但是,坦率地说,我认为这不是最佳策略。一方面,它阻止了从stdin或管道或任何非常规文件(因为这些文件不可检索)中获取输入。

通常,您可以一次使用fgets甚至一次使用一个字符来读取和标记文件,