Как я могу сделать так, чтобы strtok включал новые строки в конце токена? - PullRequest
0 голосов
/ 12 февраля 2019

В программе, которую я пишу, мне нужно иметь возможность разбить входной текстовый файл на слова, выполнить некоторую кодировку и затем записать в выходной файл.Проблема в том, что мне нужно сохранить новые строки.

Подход, который я пробовал, состоит в том, чтобы strtok сохранял символы новой строки в конце слова, однако, strtok будет включать только один символ новой строки, прежде чем двигаться дальше.Если есть следующая новая строка, она становится ее собственным токеном.Как я могу изменить это поведение, чтобы токены включали все новые строки перед переходом к следующему слову?

int changeNewLine(char* p) {
    p = p + (strlen(p)-1);
    int newlines = 0;
        while(*p == '\n') {
            *p = '\0';
            newlines++;
            p--;
        }
    return newlines;
}

void main(int argc, char *argv[]) {
    FILE *inputfile = fopen(argv[1],"rw");
    FILE *outputfile = fopen("output.txt","wb");
    char buffer[128];
    char *token;
    char words[MAX_CODE][WORDLEN];
    int i = 0;
    unsigned short newlines[MAX_CODE];

    while(fgets(buffer, 128, inputfile)){
            token = strtok(buffer," ");
            while(token != NULL) {
                newlines[i] = changeNewLine(token);
                strcpy(words[i], token);
                i++;
                token = strtok(NULL," ");
            }
        }
    ...
}

Выше приведен фрагмент моего кода.Идея состоит в том, чтобы подсчитать количество новых строк в токене, а затем выписать их обратно.

1 Ответ

0 голосов
/ 12 февраля 2019

strtok уже включает новые строки в токене, так как вы используете строку-разделитель, которая не содержит новую строку.Но в вашей программе, какой она есть сейчас, у вас никогда не будет больше одного токена, потому что fgets читает (максимум) по одной строке за раз.Вот и вся его цель.Он никогда не выдаст вам строку, содержащую две или более новых строк, и не содержащую новую строку где-либо, кроме последнего символа.

Ваши общие альтернативы

  1. для просмотра последующих строк вЧтобы найти дополнительные новые строки, или
  2. ретроспективно обновите счетчик новой строки в предыдущей строке, когда встречаете строку, начинающуюся с новой строки (и, следовательно, не содержащую ничего другого).

Alternative (1) может также включать использование совершенно другого подхода к чтению ввода, такого как чтение блока с fread() или чтение по буквам с fgetc().

...