C程序读取文件并打印数组中提到的所有行

时间:2018-05-10 00:17:44

标签: c

def done():
    global i
    quitvalue=str(input("Play Again?(y/n):"))
    if quitvalue=='n' and i==0:
            SystemExit
    elif quitvalue=="y":
                i=1

现在我的代码打印文件的第9行。是否有任何有效的方法来打印数组中的行号。 基本上,如果我有两个整数的数组,如0和1。 我想只打印那两行。 (数组大小是基于用户输入数字的动态)。

感谢

2 个答案:

答案 0 :(得分:2)

如果您的行号数组按升序排序,您可以通过修改代码来执行此操作:

int lineNumbers[] = {1, 3, 5, 7, 9};
size_t numElements = sizeof(lineNumbers)/sizeof(lineNumbers[0]);
size_t currentIndex = 0;
...
while ( fgets ( line, sizeof line, file ) != NULL ) {/* read a line */
    i++;
    if (i  == lineNumbers[currentIndex]) {
        fputs ( line, stdout ); /* write the line */
        if (++currentIndex == numElements) {
            break;
        }
    }
}

这使您可以确定i是否等于下一个所需的行,而不会反复遍历数组。

答案 1 :(得分:2)

如果确保对lineSeekArray进行排序以使其值按升序排列,则可以使用从0到lineSeekArray中的最大值的单个循环。现在你只会尝试阅读尽可能多的行。您还可以避免遍历lineSeekArray

您无法避免必须从文本文件的开头读取每一行。如果您以二进制格式存储它,您将具有随机访问功能。那是因为你可以只计算每一行的起始位置并直接读取它。

Initialising j = 0. 
for(i = 0; i < size; ++i){ 
    1. Attempt to read line from file and exit loop on failure.
    2. If i == lineSeekArray[j] --> print line, increment j, exit loop if j >= size
}