从文件或stdin读取并删除空行的C程序

时间:2015-04-28 21:31:28

标签: c arrays stdout fopen

我是C的新手,在这里我有一个C程序,它将从命令行接收X量的文件并将文件输出到stdout但删除空白行。如果用户没有输入任何文件,它将直接从标准输入读取。

除了删除线条外,一切都能顺利运行。

这是我的程序

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define NUMCHARS 1024


int main (int argc, char** argv)

{
    int good_file = 0;

    if(argc <= 1){
        good_file++;
        test(stdin);
    }

    FILE* files[argc - 1];
    int i;
    for(i = 0; i < argc - 1; i++){
        if ((files[i]=fopen(argv[i+1], "r"))==NULL){
            continue;
            }
                else{
                    good_file++;
                    test(files[i]);
            }

    }

        if(!good_file){
            fprintf(stderr, "ERROR!\n");
        }

}

int test (FILE *file)
    {
        char buffer[NUMCHARS];

        while (fgets(buffer, NUMCHARS, file) != NULL)
                part2(buffer);
            fclose(file);

    }

int part2 (char *buffer)
{
    if(*buffer != '\n' || *buffer != '\t' || *buffer != ' '){           //if(*buffer != '\n') successfully deletes (skips) plain newlines
    fputs(buffer, stdout);
    }
}

在功能第2部分中,正如您通过我的评论所看到的,如果我将||移至'\t'并且该' '已删除,则该程序将成功删除(跳过) 换行符if语句中的>>> A = (10, "mil") >>> print(A) Error: <repr(<__main__.Volume at 0x9ab7cc0>) failed: TypeError: __repr__ returned non-string (type NoneType)> 。但是很多空白行不一定是“空白”。即它们上面会有标签或白色空间。使用我删除换行符的逻辑,我将它应用于制表符和空格。

但是通过这个新的实现,它甚至不会跳过换行符。并且它不会起作用。

感谢您的反馈!

4 个答案:

答案 0 :(得分:2)

你的情况总是如此,所以没有任何事情:

if (*buffer != '\n' || *buffer != '\t' || *buffer != ' ') {
    fputs(buffer, stdout);
}

您要问&#34;第一个字符不是换行符还是不是制表符或不是空格?&#34;每个角色都可以这样说:空格不是换行符,换行符不是制表符。您需要检查该行中的所有字符:

int is_all_white(char *s) {
    while (*s) {
        if (!('\n' == *s || '\t' == *s || ' ' == *s)) return 0;
        s += 1;
    }
    return 1;
}

... 

if (! is_all_white(buffer)) {
    fputs(buffer, stdout);
}

答案 1 :(得分:0)

以下if声明的条件

if(*buffer != '\n' || *buffer != '\t' || *buffer != ' ')

对于每一行都是如此。

您应该更改要使用的逻辑:

int isBlankLine(char const* line)
{
   for ( ; *line != '\0'; ++line )
   {
      if ( !isspace(*line) )
      {
         return 0;
      }
   }
   return 1;
}

int part2 (char *buffer)
{
   if (!isBlankLine(buffer) )
   {
      fputs(buffer, stdout);
   }
}

答案 2 :(得分:0)

您的if条件始终满足 - 您检查缓冲区的第一个字符是否不是换行符,如果是换行符,则检查它是否不是标签。

您可以将条件中的所有||替换为&& - 这意味着第一个字符不是换行符,空格或制表符的每一行都会被打印出来。

您真正想要做的是使用[isspace] 1功能检查该行的每个字符。如果存在非空白字符,则可以打印它。

答案 3 :(得分:-2)

if(*buffer != '\n' || *buffer != '\t' || *buffer != ' '){
    fputs(buffer, stdout);
}

替换为

char c;
if(1==sscanf(buffer, " %c", &c)){
    fputs(buffer, stdout);
}