Как разделить токены внутри буфера c? - PullRequest
0 голосов
/ 25 апреля 2019

Я использую 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 Ответ

1 голос
/ 25 апреля 2019

Строка (в C) должна заканчиваться символом NUL (0).fread ничего не добавляет к данным, которые он читает, поэтому, если вы собираетесь использовать fread так, как вы делаете, вам нужно добавить NUL самостоятельно (что означает, что вы должны убедиться, что вы выделилиодин дополнительный байт для его хранения.)

Но, честно говоря, я не думаю, что это оптимальная стратегия.Во-первых, это исключает получение входных данных от стандартного ввода, канала или чего-либо еще, что не является обычным файлом (потому что они не доступны для поиска).

Как правило, вы можете читать и маркировать файл одной строкой за один раз.время, используя fgets или даже символ за раз,

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...