Во-первых, у вас нет проверки ошибок.Это затрудняет использование вашей программы.
Во-вторых, вы выводите каждый символ безоговорочно, а затем выводите символы новой строки в дополнительное время.То, что вы хотите сделать, это вывести каждый символ один раз, если только он не является новой строкой сразу после новой строки (как это создаст пустую строку), и в этом случае вы не хотите выводить ее.
Вот исправленный кодup:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv)
{
if (argc < 2)
{
fprintf (stderr, "An argument is required\n");
return -1;
}
char *name = argv[1];
FILE *f = fopen(name, "r");
if (f == NULL)
{
fprintf (stderr, "Unable to open file for reading\n");
return -1;
}
char x, px = '\n';
while(fscanf(f, "%c" , &x) > 0)
{
// don't output a newline after a newline
if ((x != '\n') || (px != '\n'))
printf("%c", x);
// keep track of what character was before the next one
px = x;
}
}
Было бы намного проще просто прочитать каждую строку и затем вывести строку, если она не пустая.