No.14524![]() |
入力した位置のテキストを読む 投稿者---bf(2004/06/09 09:37:05) |
||
あああああ ここここここここ ねねねね ううううううううう れれれれ ひひひひひひ どどどどどどどどどどど ふふふ ののののののの むむむむむむ ぎぎぎぎぎ すすすすすすすすす をををををを けけけ えええええええええ ししししししししし このようなテキストから「1」を入力すると改行が入るまでの あああああ ここここここここ ねねねね 「2」を入力すると同じく ううううううううう れれれれ ひひひひひひ どどどどどどどどどどど と出力されるプログラムを考えています。 このテキストは5000行ぐらいあるものとします。 いいアドバイスをお願いします。 |
No.14525![]() |
Re:入力した位置のテキストを読む 投稿者---shu(2004/06/09 09:43:43) |
||
改行の連続に注目してみる。 |
No.14530![]() |
Re:入力した位置のテキストを読む 投稿者---あかま(2004/06/09 14:42:07) |
||
ファイルから直読みでランダムアクセスは無理だろうからひたすら線形探索。 fgets(str,256,fp); で一行読み込んで str[0] == '\n' なら改行○個目…ってやればそんなに難しくないかと。 もしくはファイルの内容を全て読み込んでしまえばランダムアクセスも可。 |
No.14531![]() |
Re:入力した位置のテキストを読む 投稿者---かずま(2004/06/09 19:35:23) |
||
while (scanf("%d", &i) == 1 && i > 0) { rewind(fp); while (--i > 0) while (fgets(buf, sizeof buf, fp) && *buf != '\n') ; while (fgets(buf, sizeof buf, fp) && *buf != '\n') fputs(buf, stdout); } ---------------------------------------------------------------------- または、 fpos_t pos[3000]; for (i = 0; i < 3000; i++) { fgetpos(fp, pos + i); while (fgets(buf, sizeof buf, fp) && *buf != '\n') ; } while (scanf("%d", &i) == 1 && i > 0 && i <= 3000) { fsetpos(fp, pos + i - 1); while (fgets(buf, sizeof buf, fp) && *buf != '\n') fputs(buf, stdout); } |
No.14532![]() |
Re:入力した位置のテキストを読む 投稿者---かずま(2004/06/09 19:53:14) |
||
訂正します。(無駄が多いので) fpos_t pos[3000]; for (n = 0; n < 3000; n++) { fgetpos(fp, pos + n); while (fgets(buf, sizeof buf, fp) && *buf != '\n') ; if (feof(fp)) break; } while (scanf("%d", &i) == 1 && i > 0 && i <= n) { fsetpos(fp, pos + i - 1); while (fgets(buf, sizeof buf, fp) && *buf != '\n') fputs(buf, stdout); } |