Во-первых, позвольте мне начать с того, что fscanf()
не идеальная функция для того, что вы делаете, используйте fgets()
или getline()
, как уже заявили другие. Во-вторых, вы должны заметить, что два последних оператора while в вашей программе будут пропущены, поскольку к тому моменту, когда поток выполнения достигнет этой точки, оба потока fp2
и fp1
уже будут в EOF.
Теперь, что касается вашего вопроса, ваша проблема заключается в следующем: "%[^\n]s"
Если вы хотите прочитать строку текста, завершающий 's'
не нужен, и потребуется, чтобы входной поток содержал 's'
после последовательности соответствует %[^\n]
Что означает шаблон %[^\n]
, так это «прочитать все до первого '\n'
, но не включая сам '\n'
, который останется в буфере; это не хорошо, если следующий fscanf()
вызов будет читать это осталось '\n'
и ничего более. Чтобы решить эту проблему, вам нужно очистить буфер, что-то вроде fscanf(fp, "%*c")
должно работать. Он будет читать в запасной символ '\n'
, это будет необходимо сделать что после каждого звонка fscanf()
. Примерно так:
while(! feof(fp1)) {
fscanf(fp1, "%[^\n]", string1);
fscanf(fp1, "%*c");
printf("%s\n", string1);
while (! feof(fp2)) {
fscanf(fp2, "%[^\n]", string2);
fscanf(fp2, "%*c");
printf("%s\n", string2);
result = strcmp(string1, string2);
if (result == 1) {
printf("%s has been ADDED...\n", string1);
}
}
}