在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(),使其从中间的某个位置开始扫描吗?
您可以使用fseek
函数将文件光标跳转到文件中的任意偏移量,前提是您知道需要跳过的字节数。
如果你事先不知道需要跳过多少个字符,你最好的选择是连续读取文件中的行,跳过那些不符合你标准的行。在你的情况下,你可以跳过所有只有一个空格的行,一旦你找到一行有两个空格,就可以继续阅读
希望这能有所帮助!
您可以读取和忽略数据,直到达到所需的值。例如,读取具有fgets
的一行,然后使用sscanf
尝试将该行转换为三个数字。如果sscanf
的返回不是3,它就无法转换三个数字,所以继续到下一行。当sscanf
返回3时,您可以将结果保存在一个数组(或其他任何数组)中。
要真正跳到文件中的后一点,您需要知道要跳到的偏移量,并将其输入到fseek
。不过,这似乎不太可能在这里适用。
如果你的文件很大并且你知道(肯定)它只由2个数字行和3个数字行组成,你可以做一些类似二进制搜索的事情来找到第一个3个数字的行。你可以先找到文件的长度,然后在文件的一半处寻找。阅读并忽略其中一行(因为你可能没有找到一行的开头)。然后阅读下一行,并尝试将其转换为如上所述。如果它有三个数字,那么你已经超过了三条数字线开始的点,所以在回到开始的一半时再试一次(如果它只有两条数字线,就在离结束的一半处)。
你可能不想保持太长时间——当你距离三个数字行的开头只有几千字节(左右)时,按顺序阅读直到找到开头可能会更快,而不是做更多的工作来寻找正确的点。