在C中,我想只扫描输入中的一些行来保存程序的运行时间。例如:
假设我的输入文件包含一些随机数字,如:
5 1
1 2
1 7
5 6
3 4
1 6
2 5 3
1 5 4
3 1 1
在这里,我想跳过所有双打数字,从三元组开始,即
2 5 3
1 5 4
3 1 1
我可以重定向scanf(),使其从中间某处开始扫描吗?
答案 0 :(得分:2)
您可以使用fseek
函数将文件光标跳转到文件中的任意偏移量,前提是您知道需要跳过的字节数。
如果您事先不知道需要跳过多少个字符,最好的选择是连续读取文件中的行并跳过那些与您的条件不符的行。在您的情况下,您可以跳过所有只有一个空格字符的行,并且一旦找到包含两个空格的行就可以继续阅读。
希望这有帮助!
答案 1 :(得分:2)
您可以阅读并忽略数据,直到达到您想要的效果。例如,使用fgets
读取一行,然后使用sscanf
尝试将该行转换为三个数字。如果sscanf
的返回值不是3,则无法转换三个数字,因此请继续下一行。当sscanf
返回3时,您可以将结果保存在数组中(或其他任何内容)。
要真正跳到文件中的稍后位置,您需要知道要跳过的偏移量,并将其提供给fseek
。这似乎不太适用于此。
如果您的文件很大和,您知道(当然)它只包含2个数字行后跟3个数字行,您可以执行类似二进制搜索的操作来查找第一个3号线。您首先找到文件长度,然后在文件的中途搜索(大约)。读取并忽略一行(因为您可能没有寻找到行的开头)。然后阅读下一行并尝试按上述方式转换它。如果它有三个数字,那么你已经超过了三个数字线开始的点,所以再试一半回到开头(如果它只是一个2数字的行,到结尾的一半)。
你可能不想把它保持太长时间 - 当你在三个数字行的开头几千字节(左右)之内时,你可能会更快地按顺序阅读,直到找到开始而不是做更多寻求找到正确的点。