如何在C(STDIN)中扫描重定向文件?

时间:2014-03-06 17:32:09

标签: c scanf io-redirection

说我正在打电话给一个程序:

$ ./dataset < filename

其中filename是具有x个行对的任何文件,其中第一行包含字符串,第二行包含由空格分隔的10个数字。最后一行以“END”结尾

然后我怎样才能开始将第一行对(字符串)放入:

char *experiments[20] // max of 20 pairs

和第二行(数字)成:

int data[10][20] // max of 20, 10 integers each

任何指导?我甚至不明白我应该如何将文件扫描到我的数组中。

更新

所以说这是我的档案:

Test One  
0 1 2 3 4 5 6 7 8 9  
END

然后重定向此文件意味着如果我想将第一行放入我的*实验中,我需要扫描它吗?

scanf("%s", *experiments[0]);

这样做会给我一个错误:分段错误(核心转储)

这是不正确的?

说我的文件只是数字,例如:

0 1 2 3 4 5 6 7 8 9

然后,
scanf("%d", data[0][0]);有效,价值为'1'。是否有更简单的方法为整个数据线执行此操作?即data[0-9][0]

3 个答案:

答案 0 :(得分:1)

重定向的文件与FILE * stdin相关联。它已经为你打开了......

否则,您可以将其视为与任何其他文本文件相同,和/或使用专用于标准输入的函数 - 唯一的例外是您无法在文件中搜索而不检索输入的大小。

答案 1 :(得分:1)

找到伪代码,代码解释了如何读取输入

int main()
{ 

    char str[100]; // make sure that this size is enough to hold the single line
    int no_line=1;

    while(gets(str) != NULL && strcmp(str,"END"))
    {    
            if(no_line % 2 == 0)
            {
                /*read integer values from the string "str" using sscanf, sscanf can be called in a loop with %d untill it fails */   
            }  
            else
            {
                /*strore string in your variable "experiments" , before copying allocate a memory for the each entry */ 
            }
         no_line++;
    }
 }

答案 2 :(得分:0)

对于你所谈论的数据大小,到目前为止,最简单的方法就是将所有内容放入缓冲区并进行处理:你不必非常吝啬,只需确保你没有超支。

如果你想对内存过于吝啬,请从malloc()预先分配一个带有read()的4kB缓冲区,逐步stdinrealloc()每次另外4kB输入超出了您已阅读的内容。如果你不太在乎内存的吝啬(例如在具有千兆字节内存的现代机器上),只需要malloc()比预期输入大得多的东西(例如兆字节),如果输入是更重要的是:这更容易实现,但不那么普遍/优雅。

然后你将所有输入放在一个缓冲区中,你可以用它做你喜欢的事情,这对我的输入格式有很大的依赖性,可以说明你应该如何处理那个部分。