В настоящее время я пишу программу c, которая будет принимать 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
else if (count == maxLen)
, где вы переполняете свой массив. - person paddy   schedule 09.12.2016char
за пределами диапазона 0-127 не является правильно закодированной кодовой точкой UTF8. - person chux - Reinstate Monica   schedule 09.12.2016int maxLen
в вашем примере? - person chux - Reinstate Monica   schedule 09.12.2016char ch = getc(inFile); while (ch != EOF) {
--›int ch; while ((count + 1 < maxLen) && (ch = getc(inFile)) != EOF) {
для начала - person chux - Reinstate Monica   schedule 09.12.2016str[count] = (char)ch; printf("Adding %s to output\n", str);
происходит, когдаcount == 10
получает ввод"For Whom t\n"
, поэтому код выполняетstr[10] =
\n;
, который записывает внеchar str[maxLen];
. Кроме того, нулевой символ, добавленный передstr[]
, не используется вprintf("Adding %s to output\n", str);
, поэтомуprintf()
не знает, где заканчиваться. ИМО, здесь нет проблем с UTF8. - person chux - Reinstate Monica   schedule 09.12.2016