我尝试创建一个.c程序,当它运行时,它接受一个文件,并且只打印上面有东西的行(空格、字母、number....etc),而不打印空行。
我需要在使用ubuntu的虚拟机上运行它(它运行的是最新版本的ubuntu)。到目前为止,我只打印了它的内容,而不是像在文件中那样打印在行上。
代码:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv)
{
char *name = argv[1];
FILE *f = fopen(name, "r");
char x;
while(fscanf(f, "%c" , &x) > 0)
{
printf("%c", x);
if(x == '\n')
{
printf("\n");
}
}
}
文件内容:
as
d
3
结果:
asd3
期望的结果:
as
d
3
发布于 2019-06-03 06:47:30
首先,你没有错误检查。这使得你的程序很难使用。
其次,您无条件地输出每个字符,然后额外输出换行符。您想要做的是输出每个字符一次,除非它是紧跟在换行符后面的换行符(因为那样会创建一个空行),在这种情况下,您不想输出它。
下面是修复后的代码:
#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;
}
}
如果只读入每一行,如果该行不为空,则输出该行,这真的会容易得多。
发布于 2019-06-03 17:14:13
您可以使用fgets()函数获取包括换行符(\n)在内的整个行,在读取该行之后,如果第一个字符(行)是换行符,则可以跳过打印此行。
以下是执行此操作的代码段,您需要按照@David Schwartz所做的那样对argc和文件是否存在进行错误检查
char line[200];
while (fgets(line, 100, fp))
{
if (line[0] != '\n')
printf(line);
}
这应该是可行的。
https://stackoverflow.com/questions/56419404
复制相似问题