アプリ版:「スタンプのみでお礼する」機能のリリースについて

Unix C++でファイルから、特定の行を読みこむことは可能でしょうか。
例えば、5行目から最後の行まで。10行目から20行目。等。

A 回答 (3件)

 CやC++には、テキストファイルから指定した行を読み込むという関数は用意されていません。


 ですので、ファイル先頭から行単位で読んでいき、読んでいる行数を変数でカウントしながら、目的の行だけ配列に入れるなどの処理を行うことになります。

 行単位の読み込みは、istream系オブジェクトに用意されたgetlineメソッドで行えばよいでしょう。

#include <iostream.h>
#include <fstream.h>

int main(void)
{
  ifstream fin;
  int s = 10;   // 先頭からなら 1 を指定する
  int e = 20;   // 末尾までなら -1 を指定する
  const int bufsize = 256;
  char buf[bufsize];

  fin.open("xxx", ios::in | ios::nocreate);
  if (fin.fail()) {
    cerr << "ファイルを開けません\n";
    return 1;
  }
  for (int i = 1; i < s; i++)   // 読み飛ばし
    fin.getline(buf, bufsize);
  for (int i = s; i<=e || (e==-1 && !fin.eof()); i++) {
    fin.getline(buf, bufsize);
    cout << buf << endl;
  }
  fin.close();

  return 0;
}

 ところで、これまでの回答には何の補足もお礼もありませんが、解決はしたのですか?未解決なら分からないところを書かないと、新しい回答は書きにくいものですよ。
    • good
    • 2
この回答へのお礼

getlineという関数もあるのですね。
初めて知りました。

回答を読む時間しかなくて、お礼が遅くなってしまってました。
これからはこまめに見るようにしたいと思います。

回答ありがとうございました。

お礼日時:2001/07/05 14:27

L_E_Dさんも書かれていますがfgets等行単位で読み込む関数を使えば可能です。


しかしどうも文面から察するにロジックの組み立てに慣れていないのではないでしょうか?
少なくともファイルがオープンできていれば後はfor文等で簡単に出来ます。(カウンターで行数をカウントすれば良いですよね)
頭から4行目までは読み出すだけで捨てておいて5行目からEOFが出るまで読み込んでいけば最初の例はクリアできますよね。
2番目の例も10行目から20行目までの読み込みが終わったらループを抜ければ良いだけです。

それともひょっとしたらUnixのコマンド(tail等)で同様のことが一発で出来るのでUnix環境ならC++でも出来ると誤解されていますか?
環境が変わってもロジック的なところは共通ですよ。
    • good
    • 0
この回答へのお礼

必要な行だけを使えばよかったのですね。
そこまで考え付きませんでした。
なんか便利な関数があったりするのかなあって思ったので質問したのですが・・・。
回答ありがとうございました。

お礼日時:2001/07/05 14:24

fgetsのループで出来ます。

詳細はヘルプを見て下さい。
    • good
    • 0
この回答へのお礼

ありがとうございました。
なんとか解決しました。

お礼日時:2001/07/05 14:20

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています