说我正在打电话给一个程序:
$ ./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]
。
答案 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缓冲区,逐步stdin
和realloc()
每次另外4kB输入超出了您已阅读的内容。如果你不太在乎内存的吝啬(例如在具有千兆字节内存的现代机器上),只需要malloc()
比预期输入大得多的东西(例如兆字节),如果输入是更重要的是:这更容易实现,但不那么普遍/优雅。
然后你将所有输入放在一个缓冲区中,你可以用它做你喜欢的事情,这对我的输入格式有很大的依赖性,可以说明你应该如何处理那个部分。