C: Как использовать getc, чтобы избежать появления символов, отличных от UTF-8?
В настоящее время я пишу AC-программу, которая будет принимать 3 аргумента, два файла (один входной и один выходной) и int (максимальная длина выходных строк, назовите это x). Я хочу прочитать каждую строку во входном файле и записать первые x символов в выходной файл (эффективно "обрезая" файл).
Вот мой код:
int main(int argc, char *argv[]) {
const char endOfLine = '\n';
if (argc < 4) {
printf("Program takes 4 params\n");
exit(1);
} else {
// Convert character argument [3] (line length) to an int
int maxLen = atoi(argv[3]);
char str[maxLen];
char *inputName;
char *outputName;
inputName = argv[1];
outputName = argv[2];
// Open files to be read and written to
FILE *inFile = fopen(inputName, "r");
FILE *outFile = fopen(outputName, "w");
int count = 0;
char ch = getc(inFile);
while (ch != EOF) {
if (ch == '\n') {
str[count] = (char)ch;
printf("Adding %s to output\n", str);
fputs(str, outFile);
count = 0;
} else if (count < maxLen) {
str[count] = ch;
printf("Adding %c to str\n", ch);
count++;
} else if (count == maxLen) {
str[count] = '\n';
}
ch = getc(inFile);
}
}
return 0;
}
Единственная проблема заключается в том, что если последний символ представляет собой одинарную кавычку, он печатает не символы UTF-8, например:
For Whom t
John Donne
No man is
Entire of
Each is a
A part of
If a clod
Europe is
As well as
As well as
Or of thin
Each man��
For I am i
Therefore,
For whom t
1 ответ
Вы можете проверить, был ли последний вывод char продолжением байта utf-8 10xxxxxx
и если так, продолжайте выводить, пока персонаж не завершится.
// bits match 10xxxxxx
int is_utf_continue_byte(int ch){
return ch & 0x80 && ~ch & 0x40;
}
//...
while (is_utf_continue_byte(ch))
putchar(ch), ch = getchar();