【问题标题】:C - Using angle brackets in command linesC - 在命令行中使用尖括号
【发布时间】:2018-04-04 13:01:02
【问题描述】:

目前我有这个代码:

int main(int argc,char* argv[]) {
    FILE * fp;
    char * line = NULL;
    size_t len = 0;
    ssize_t read;

    char * txtfile = argv[1];

    fp = fopen(txtfile, "r");
    if (fp == NULL)
        exit(EXIT_FAILURE);

    while ((read = getline(&line, &len, fp)) != -1) {
        printf("Retrieved line of length %zu :\n", read);
        printf("%s", line);
    }

    fclose(fp);
    if (line)
    free(line);
    exit(EXIT_SUCCESS);

    return 0;
}

它的功能是逐行读取文件并打印其内容以及该行上的字符数,但是当我尝试传递尖括号如'>'或'

./hello < output.txt 

读取文件。

注意,我得到的规范说我的代码将以这种特定的方式进行测试,我只是想知道如何在没有引号的情况下使用“(添加了 OP 评论,以明确不可更改的要求。)

有什么办法可以解决这个问题吗?任何提示将不胜感激!

【问题讨论】:

  • &gt; 是一个 shell 命令。 Ist 会将前一个命令的输出重定向到一个文件。 &lt; 将从文件中读取。
  • ./hello &lt; output.txt 实际上并没有将 &lt;output.txt 作为参数传递。
  • 您要解决的问题是什么?您的代码将通过将 output.txt 的内容作为输入进行测试。因此,您读取输入的所有方式(例如scanf())都将从该文件接收文本。您的程序的目标是从用户那里读取某些内容并对该输入做出反应。如果这不是真的,那么请举一个你的编程作业的例子,并解释为什么使用scanf()(或其他东西)不适用于访问测试输入。
  • 嗯,将被提供的参数将是作为命令行参数的文本文件的名称(所以我不知道如何使用 scanf),恰好角度支架会在那里。我想知道的是尖括号的作用以及如何使代码正常工作,因为目前它还没有。
  • 代码无条件地尝试打开argv[1](通过txtfile)。这是不好的。你是对的,@Yunnosch,调用./hello &lt; output.txt 不会有非空的argv[1] — 只有argv[0]argc == 1argv[1] == NULL。所以我建议的检查将有助于防止程序崩溃,并有助于证明&lt; 和重定向的文件名output.txt 都不是作为程序的参数给出的。

标签: c command-line-arguments


【解决方案1】:

您没有问题需要解决。
您的代码将通过将 output.txt 的内容作为输入进行测试。这就像用户输入输入一样,成为所有读取输入方式的标准输入。这称为“输入重定向”。
因此,您读取输入的所有方式(例如scanf())都将从该文件接收文本。

大概您的程序的目标是从用户那里读取某些内容并以指定的方式对该输入做出反应。如果不是这样,请举例说明您的一项编程作业,并解释为什么使用 scanf()(或其他东西)不适用于访问测试输入。

换句话说,如果您的问题是您无法访问“命令行参数”(实际上不是命令行参数,因此您无法访问它们),那么试试这个:
制作一个简单的输入转发器(读取输入并仅打印 if),其中包含该名称的文件并具有一些“hello input redirection world”输入。按照指定从命令行构建并运行它。
它是否显示文件“output.txt”的内容?我预料到了。
这不是没有预期命令行参数的解决方法吗?

根据 Jonathan Leffler 的推荐,检查是否存在非 NULL argv[1] 参数。如果没有,请研究输入重定向的概念,以找出您的程序可能需要的输入位置。

【讨论】:

  • 我想你不明白,规范是把一个文本文件作为命令行参数,格式为:./hello
  • 我们中的一个人不了解如何测试您的代码的规范,我同意。你能引用你问题中的描述吗?我相信我们可以解决我们的误解。
  • 查看此处以验证您在问题中描述的语法是否正是表明您的程序不会有命令行参数的语法:tutorialspoint.com/unix/unix-io-redirections.htm
  • 也看看我链接的副本。回答之前没找到。
  • @Calahan:输入重定向在 Windows 中也可以在 CMD.EXE 提示符下工作 - 并且可能也适用于 PowerShell。
【解决方案2】:

试试:

./hello " output.txt

它将&lt; 作为逗号参数传递,输出将被重定向到 output.txt。

【讨论】:

  • 这也不起作用,并且给我的规范说我的代码将以这种特定方式进行测试,我只是想知道如何在没有引号的情况下使用“
【解决方案3】:

试试单引号,像这样:

./hello '<' output.txt 

单引号禁止对字符序列的所有解释。

【讨论】:

  • 效果很好,但是我的代码测试不会包含括号中的引号,这是我目前的困境。
  • 您不能修改测试以在括号中包含引号吗?
【解决方案4】:

以下建议的代码:

  1. 干净编译
  2. 执行所需的功能
  3. 将每次调用的结果输出到getline()

现在建议的代码:

#include <stdio.h>
#include <stdlib.h>


int main( void )
{
    char * line = NULL;
    size_t len = 0;
    ssize_t getlineStatus;


    while ((getlineStatus = getline(&line, &len, stdin) != -1) )
    {
        printf("Returned value from getline(): %ld :\n", getlineStatus);
        printf( "number of bytes allocated for line: %lu\n", len );
        printf("%s\n\n", line);
        free( line );
        line = NULL;
        len = 0;
    }

    free( line );
    return 0;
}

我正在运行 ubuntu linux 16.04。使用源文件作为输入:

untitled2 < untitled2.c

结果:

Returned value from getline(): 1 :
number of bytes allocated for line: 120
#include <stdio.h>


Returned value from getline(): 1 :
number of bytes allocated for line: 120
#include <stdlib.h>


Returned value from getline(): 1 :
number of bytes allocated for line: 120



Returned value from getline(): 1 :
number of bytes allocated for line: 120



Returned value from getline(): 1 :
number of bytes allocated for line: 120
int main( void )


Returned value from getline(): 1 :
number of bytes allocated for line: 120
{


Returned value from getline(): 1 :
number of bytes allocated for line: 120
    //FILE * fp;


Returned value from getline(): 1 :
number of bytes allocated for line: 120
    char * line = NULL;


Returned value from getline(): 1 :
number of bytes allocated for line: 120
    size_t len = 0;


Returned value from getline(): 1 :
number of bytes allocated for line: 120
    ssize_t getlineStatus;


Returned value from getline(): 1 :
number of bytes allocated for line: 120



Returned value from getline(): 1 :
number of bytes allocated for line: 120
    //char * txtfile = argv[1];


Returned value from getline(): 1 :
number of bytes allocated for line: 120



Returned value from getline(): 1 :
number of bytes allocated for line: 120
    //fp = fopen(txtfile, "r");


Returned value from getline(): 1 :
number of bytes allocated for line: 120
    //if (fp == NULL)


Returned value from getline(): 1 :
number of bytes allocated for line: 120
    //    exit(EXIT_FAILURE);


Returned value from getline(): 1 :
number of bytes allocated for line: 120



Returned value from getline(): 1 :
number of bytes allocated for line: 120
    while ((getlineStatus = getline(&line, &len, stdin) != -1) )


Returned value from getline(): 1 :
number of bytes allocated for line: 120
    {


Returned value from getline(): 1 :
number of bytes allocated for line: 120
        printf("Returned value from getline(): %ld :\n", getlineStatus);


Returned value from getline(): 1 :
number of bytes allocated for line: 120
        printf( "number of bytes allocated for line: %lu\n", len );


Returned value from getline(): 1 :
number of bytes allocated for line: 120
        printf("%s\n\n", line);


Returned value from getline(): 1 :
number of bytes allocated for line: 120
        free( line );


Returned value from getline(): 1 :
number of bytes allocated for line: 120
        line = NULL;


Returned value from getline(): 1 :
number of bytes allocated for line: 120
        len = 0;


Returned value from getline(): 1 :
number of bytes allocated for line: 120
    }


Returned value from getline(): 1 :
number of bytes allocated for line: 120



Returned value from getline(): 1 :
number of bytes allocated for line: 120
    //fclose(fp);


Returned value from getline(): 1 :
number of bytes allocated for line: 120
    //if (line)


Returned value from getline(): 1 :
number of bytes allocated for line: 120
    //    free( line );


Returned value from getline(): 1 :
number of bytes allocated for line: 120
    return 0;


Returned value from getline(): 1 :
number of bytes allocated for line: 120
}

【讨论】:

    猜你喜欢
    • 2021-05-29
    • 1970-01-01
    • 1970-01-01
    • 2010-09-20
    • 1970-01-01
    • 1970-01-01
    • 2012-12-20
    • 1970-01-01
    相关资源
    最近更新 更多