【问题标题】:How to split tokens inside a buffer c?如何在缓冲区 c 中拆分令牌?
【发布时间】:2019-04-25 00:30:57
【问题描述】:

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

【问题讨论】:

  • 这与您的主要问题无关——严格来说,您也应该关闭file2。当您退出时,系统为您执行此操作,但让它执行此操作不是一个好习惯;你应该明确地关闭它。
  • 谢谢,我忘了关闭第二个文件。
  • 如图所示读取整个文件是开展业务的一种方式。您应该检查fread() 返回的数据是否与您预期的一样多。然后,您需要知道文件 确实 包含什么,以便对其进行解析。如果它包含文本数据行,您可以在换行符上拆分并依次获取每一行。如果文件包含二进制数据,您必须知道该数据是如何写入的才能对其进行解释。
  • @Lordravenblack 这里有一些提示可能对您有所帮助 stackoverflow.com/questions/30418440/…link

标签: c buffer


【解决方案1】:

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

但是,坦率地说,我认为这不是最佳策略。首先,它排除了从标准输入或管道或其他任何非常规文件的输入(因为它们不可搜索)。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多