【问题标题】:How to store the value of stdin into an array in C?如何将stdin的值存储到C中的数组中?
【发布时间】:2018-07-04 20:36:20
【问题描述】:

我在将来自标准输入的文件存储到缓冲区时遇到问题。

这是我的代码:

//Go to the end of stdin and calculate the number of elements
int num;
fseek (stdin, 0, SEEK_END);
num = ftell (stdin); 

//If there is a file in the standard input
if(num > 0) {

    int resRead;

    //Read the file and store it into buffer
    if((resRead = read(STDIN_FILENO,buffer,num))){
    fprintf(stderr, "Error: Could not store the input into buffer\n");
    }

    //Display the buffer
    for (int i = 0; i < num; ++i)
    {
    printf("%c\n",buffer[i]);
    }
}

当我启动我的代码时:./interpreter

我必须明确我的文件有内容,当我检查 num 的值时,它与文件中的字符数完全对应。

有什么想法吗? :)

谢谢!!

【问题讨论】:

  • 你到底为什么要在标准输入上使用fseek()ftell()?我无法想象这会达到你的预期。
  • @ChrisTurner:如果标准输入是从文件重定向的(似乎是这种情况),那可以工作......
  • @MaxUt:有两个主要问题:(1)您将 C 库函数(fseekftell 等)与内核函数(read 等)混合在一起,这可能会导致问题..(2)您正在寻找文件的末尾,然后尝试从中读取 - 所以您没有得到任何数据,因为没有剩下的了!您可能想回到起点。 (除此之外,正如其他人指出的那样,如果您需要在输入中查找,通常最好在命令行上获取文件名并使用 open()fopen() - 但如果您知道 stdin 将 always从文件重定向,你的应该工作)。
  • @psmears 非常感谢。除了使用 fseek() 检查之外,您知道如何确保有一个文件重定向到标准输入吗?

标签: c stdin


【解决方案1】:

除非您在程序中从标准输入读取文件代码,否则操作系统级别的流式传输或文件到二进制文件的间接寻址在这种情况下不起作用。

更好的选择是将文件保存在目录中并将文件位置作为参数传递给您的程序。并使用fopen() 读取文件。

【讨论】:

    【解决方案2】:

    stdin 是一个流,这意味着它没有您可以寻求的“结束”。无法知道它是否收到了重定向文件,或者它是否正在从控制台读取用户输入。

    您需要使用malloc 为缓冲区动态分配空间,并读取尽可能多的字节。如果还有更多数据,请使用realloc 扩大缓冲区(一个好的策略是每次将大小翻倍)并阅读更多内容。

    如果您知道您将始终从文件中读取,您应该更改程序以从命令行获取文件名并使用fopen 打开文件。

    【讨论】:

    • 实际上stdin 结束,如果进程的输入从文件重定向到,则可以是seek()ed,就像在这个问题中发生的那样。
    猜你喜欢
    • 2012-11-11
    • 2021-11-27
    • 1970-01-01
    • 1970-01-01
    • 2021-07-04
    • 2013-11-05
    • 1970-01-01
    • 2012-11-20
    • 1970-01-01
    相关资源
    最近更新 更多