如何从未知输入类型(文件流或标准输入)读取数据C.

时间:2013-01-19 13:32:57

标签: c

我想知道如何从未知的输入源读取数据,这意味着我不知道用户是打算只输入一个句子还是他会给我一些文本文件。 我尝试使用fscanf因为我读过它是为了未格式化的输入类型 这是我的代码,我想要获得某种类型的输入(文件或只是一个句子(echo bla bla bla)"int"并且只打印"int"第一个单词。该程序应该用于管道意义命令看起来像这样:
有两种方法可以使用该程序:

1.echo "blabla" | myprog 2  (number of words to print)
2.cat input.txt | myprog 2  (number of words to print)

有问题的一行是第16行,我尝试使用fscanf
谢谢!

  1 #include <stdio.h>
  2 #include <ctype.h>
  3 #include <string.h>
  4 #include <stdlib.h>
  5
  6
  7 int main(int argc, char *argv[]){
  8    char *words[32];
  9    int numofwords = atoi(argv[2]);
 10    int i=0;
 11    int len;
 12    char *word = malloc (32 * sizeof(char));
 13    char c;
 14   while (i<=numofwords){
 15    if ((c = getc (argv[1])) != EOF){
 16         fscanf(argv[1],"%s",&word);
 17         len = strlen (word);
 18         words[i] = malloc ((len+1) * sizeof(char));
 19         i++
 20    }
 21    printf(words[i]);
 22   }
 23   return 0;
 24 }
 25

3 个答案:

答案 0 :(得分:4)

可能我正确理解你的需要。

我不是在纠正你的代码,而是自己编写代码。

以下是从控制台读取的简单代码:代码:main.c

#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, char* argv[]){
    if(argc!=2){
        printf("\n wrong number of argument\n");
        exit(1);
    }
    int numofwords = atoi(argv[1]);
    char buffer[128];

    //printf("%d\n",numofwords);

    while(numofwords--){
        scanf("%s",buffer);
        printf("%s\n",buffer);
    }
    return 0;
}   

它是如何运作的:

~$ gcc  main.c -o main  

执行:

:~$ ./main 

wrong number of argument
:~$ ./main 2
grijesh
grijesh
yourname        
yourname
:~$ 

我希望你理解它。程序只需从控制台读取(扫描)并打印到控制台。 while循环运行您传递命令行输入的次数。

现在,文本文件dumy.txt输入文件:

:~$ cat dumy.txt
yourname
myname
hisname
hername
:~$   

现在通过代码了解您想要实现的目标:

:~$ cat dumy.txt | ./main 2
yourname
myname
:~$   

如果您想通过echo

:~$ echo $'one\ntwo\nthree' | ./main 2
one
two
:~$   

这是你想要的吗?

如果是:

你错过了什么:

[您的代码]

错误1,2
你的fsacnf有两种错误:

fscanf(argv[1],"%s",&word);  
  • 第一个参数是argv[1] char*,您需要传递FILE*类型。正如Oli Charlesworth先生的回答所解释的那样。

  • 其次,您仍然需要阅读stdin|运算符将第一个命令的输出重定向到第二个命令。

错误3,4,5,6
通过发送echo "blabla",您只需发送一个单一的刺痛,您需要像我一样做(我在echo字符串中为新行添加了\ n,而且我的echo字符串以$开头,所以它不是打印为原始字符串)。 echo,以便您可以根据argv[1]而不是argv[2]的第二个参数从代码中读取。所以在你的代码中,后续行也是错误的。

int numofwords = atoi(argv[2]);   

我在代码中更正了这一行。

并且i初始化为零i = 0,而while循环条件为<=,我认为它应该是<

错误7
您运行代码的方式错误echo "blabla" | myprog 2您的程序不知道mygrog您必须通过完整路径。就像我做./main一样,./表示当前目录。

这只是我对你的问题的看法。另请阅读William Pursell先生给出的评论中的答案。

如果您有其他疑问,请告诉我。

答案 1 :(得分:3)

我不确定你的问题究竟是什么,但我认为它可能是“我如何对待文件输入和控制台输入相同?”。

您是否知道stdin(标准输入)已经是FILE *?这意味着你可以将它作为第一个参数传递给fscanf,就像一个“普通”文件一样:

FILE *normal_file = fopen(...);

// Read from normal file
fscanf(normal_file, "%d", &x);
// Read from stdin
fscanf(stdin, "%d", &y);

答案 2 :(得分:3)

另一种选择是将文件名作为参数传递。

  1. echo“blabla”| myprog 2(要打印的单词数)
  2. myprog 2 input.txt(要打印的字数)
  3. 然后你:

    • 如果argc == 1,则继续正常并使用fgetc或其他替代f *方法处理stdin(stdin是FILE *)。
    • 如果argc == 2,则从argv [1]获取文件名,使用fopen(filename)获取文件*并进行处理。

    否则,你会做Oli所说的并得到第一个单词,然后fopen并传递给你的处理函数,或者fseek(stdin,SEEK_SET,0)然后将stdin传递给你的处理函数。