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
    • 0
この回答へのお礼

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も見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q「古い圧縮ファイル」の確認方法

Dドライブのディスクのクリーンアップをしたいのですが、実行できるものが、「古い圧縮ファイル」の削除しかありません。

「古い圧縮ファイル」がどのプログラムかを確認する方法を教えてください。

また、圧縮されたファイルの名前は青くなるらしいのですが、見つかりません。どうしてでしょうか
圧縮ファイルは1G弱あります。

Aベストアンサー

http://www.atmarkit.co.jp/fwin2k/win2ktips/106cleanup/106cleanup.html

初期設定では、50日以上アクセスの無かったファイルに対して、圧縮が行われます。
当然、圧縮してからでないと、ファイル名は青色にはなりませんので、ディスク・クリーンアップでの候補段階では、黒色のままです。


尚、設定によっては青色表示にならない場合も有りますけど。

http://121ware.com/qasearch/1007/app/nec.jsp?005084

QVC++でのファイルの読みこませ方

タイトルではわかりにくいと思うのですが、実際はプログラム中である指定した形式で保存されたtxtファイルなどを開いて、その中にある文字列を配列に入れて,
そのままの文字列をランダムに表示させたいのですが、なかなかいい方法が浮かびません。配列へ読みこませる関数ってあるんでしょうか?ファイルを開いてから詳しく教えていただけたら嬉しいです。
後、勉強のためにやってるので難しいというか高度なやり方があれば是非教えてください。おねがいします。

Aベストアンサー

表示の仕方が質問に書かれていませんが、
簡単なフローとしては、
1.ファイルからCFileを使いローカルなCString型変数に文字列を読み込む。
2.ローカル変数からダイアログ上の表示領域に移し表示する。
 ⇒面罵変数を作成してもいいですし、
 SetWindowText関数を使ったっていいですし。

でしょうか。

Qファイルの圧縮方法

AVIやMPGの画像ファイルを圧縮する方法を教えてください。900mb位のファイルをCD-Rに落とし込める700mbまで圧縮したいんですが。できれば、zipやlzhなどの後で解凍しなくてはいけないような圧縮方法ではなく、多少画像が荒くなってもファイルを単純に縮小させるような方法を教えていただけると有り難いのですが。。
因みに、TMPGEncを試してみたんですが、どうもうまくいかなくて。。ファイルサイズが元のファイルより逆に大きくなってしまうんです。
すいませんが、宜しくお願いします。

Aベストアンサー

画像圧縮?くす(^^
エンコはTMPGEncやaviutlでやるのがふつーです。
ええ 絶対! 
aviutl
http://ruriruri.zone.ne.jp/aviutl/

zipとかで圧縮しても意味ありません サイズ的に。

で、TMPGEncで元より大きくなるのは問題は
コーデック、画像サイズ、 音声ファイルなど
理由はいっぱいあります。対処は類似質問みて↓
http://oshiete1.goo.ne.jp/kotaeru.php3?q=625581

だから圧縮というか再エンコードが面倒なら
ファイルをテキトーな部分でカットする方向性はどお?
CD-R 2枚に保存 450 450 くらいでカット。
対処は類似質問みて↓
http://oshiete1.goo.ne.jp/kotaeru.php3?q=610331
ではでは!

追伸
カンタンにならrmファイルに変更かなあ
でも画質は落ちますよ
ネット配信 ストリーミング形式でどぞ!
RealplusG2とかRealEncoderで変換
でもaviでもないしmpegでもないですけど、どお?

参考URL:http://oshiete1.goo.ne.jp/kotaeru.php3?q=610331

画像圧縮?くす(^^
エンコはTMPGEncやaviutlでやるのがふつーです。
ええ 絶対! 
aviutl
http://ruriruri.zone.ne.jp/aviutl/

zipとかで圧縮しても意味ありません サイズ的に。

で、TMPGEncで元より大きくなるのは問題は
コーデック、画像サイズ、 音声ファイルなど
理由はいっぱいあります。対処は類似質問みて↓
http://oshiete1.goo.ne.jp/kotaeru.php3?q=625581

だから圧縮というか再エンコードが面倒なら
ファイルをテキトーな部分でカットする方向性はどお?
CD-R 2枚に保存 450...続きを読む

QMFC C++ と C++/CLI の文字列

VS2008です。

Library: NativeC++ with MFC -> DLL
  ↑↓
Wrapper: C++/CLI with .NET -> DLL
  ↑↓
Appli: VB.NET with .NET -> EXE

元々、ActiveXコントロール(非GUI利用)だったNativeC++で書かれたLibraryを
MFC DLLとしてビルドし、Wrapper 経由で Appli から使用できるよう
移植をしています。

Library から必要な関数を dllexport し、wrapper から参照し、
wrapper を Appli が参照して、使用できるようにしました。
int型を引数に取り、結果として返す関数は期待どおり動作しますが、
文字列だと上手く行きません。

Wrapper/Appli は System.CString で統一したいのですが、
Library ではどのような型として宣言すれば文字列のやり取りができるでしょうか。
( 引数・戻値の両者 )

CString wchar_t* char* System.String ALT::CStringT basic_string _bstr_t CComBSTR
LPCTSTR LPTSTR PCTSTR PTSTR LPCWSTR LPWSTR PCWSTR PWSTR BSTR…

なお、Library で下記のようにエクスポートし
__declspec(dllexport) BSTR test(LPCTSTR data);
wrapper で
BSTR hoge(LPCTSTR value){ return test(value); }
と宣言すると、wrapperのビルドで下記のエラーが表示されます。

エラー1error LNK2028: 未解決のトークン (0A000B39)
"wchar_t * __cdecl test(wchar_t const *)" (?test@@$$FYAPA_WPB_W@Z) が
関数 "public: wchar_t * __clrcall wrap::hoge(wchar_t const *)"
(?hoge@C3dlib@@$$FQ$AAMPA_WPB_W@Z) で参照されました。wrapper.objwrapper

エラー2error LNK2019: 未解決の外部シンボル
"wchar_t * __cdecl test(wchar_t const *)" (?test@@$$FYAPA_WPB_W@Z) が
関数 "public: wchar_t * __clrcall wrap::hoge(wchar_t const *)"
(?hoge@C3dlib@@$$FQ$AAMPA_WPB_W@Z) で参照されました。wrapper.objwrapper

エラー3fatal error LNK1120: 外部参照 2 が未解決です。

VS2008です。

Library: NativeC++ with MFC -> DLL
  ↑↓
Wrapper: C++/CLI with .NET -> DLL
  ↑↓
Appli: VB.NET with .NET -> EXE

元々、ActiveXコントロール(非GUI利用)だったNativeC++で書かれたLibraryを
MFC DLLとしてビルドし、Wrapper 経由で Appli から使用できるよう
移植をしています。

Library から必要な関数を dllexport し、wrapper から参照し、
wrapper を Appli が参照して、使用できるようにしました。
int型を引数に取り、結果として返す関数は期待どおり動作しますが、
文字列だと上...続きを読む

Aベストアンサー

Library の DLL に対して
Dumpbin /exports XXXXX.dll
とするとどうなりますか?

Qファイルの圧縮方法が解りません

窓の杜やベクター等に置かれている、フリーの圧縮、解凍ソフトをダウンロードしていますが、テキストファイルや、画像ファイルの圧縮方法が解りません。何方か教えて頂けませんか?

Aベストアンサー

ソフトの開発者のサイトで質問することをお奨めします。

ソフトごとに操作方法が異なりますので、使用しているソフト名すらない状態では誰も必要とする回答を出せません。

窓の杜やベクターでは開発者のサイトへのリンクがありますから、そこからアクセスできますよ。

QC++でファイルから複数行のデータを入力する方法

C++でファイル操作をプログラミングしています。
入力として使いたいファイルは以下のように記述されています。

1 2 3
2 2 2
54 57 65

のように数字の間にはスペースが入ってます。また3つ目の数字の後には
改行が入っています。

このようなデータを取り込むときはどのように記述すればいいのでしょうか?
今作ってみたコードは以下のようなんですけど、うまく格納されていません。
よろしくお願いします。

ifstream fin("ファイル名");
vector<int> x,y,z;
while (!fin.eof()){
if (!(fin >> i)) break;
x.push_back(i);
if (!(fin >> i)) break;
y.push_back(i);
if (!(fin >> i)) break;
z.push_back(i);
}

Aベストアンサー

No.2 ですが……

この場合、「うまく格納されていません」という表現は非常に困るわけです。

> 確認方法はファイルの数=aとして
 このとき、a の値を確認しましたか?
 また、a が「0」だったとしたら、強制的に a = 1 等としてみるのも良いかもしれません。「格納されていない」のか、「ファイルの数の設定が間違い」なのか、原因の切り分けをします。

また、

> cout<<x[i]<<" "<<y[i]<<" "<<z[i]<<endl;

ここで、「うまく格納されていない」と判断したのは、
・何も表示されなかったから
・表示はされたがゴミばかりだったから
・それらしい数字は表示されたが前後にゴミがあったから
・期待した数より多い/少ない個数しか表示されないから
・例外が発生して落ちたから
のどのような現象かで、原因も対処も異なってきます。

Qpsdファイルの圧縮方法

psdファイルの圧縮方法を教えてください。(基本的質問で恐縮ですが)
win98です。なお、ファイルは9MB程度ですが、圧縮したものを解凍する際、鮮明度が落ちずに元通りの画像で開けますでしょうか?

Aベストアンサー

●大きなサイズのファイルを分割して送付

+Lhaca 1.20 デラックス版での分割方法
http://park8.wakwak.com/~app/Lhaca/

 1. インストールは、ダウンロードした Lhaca120.exe を実行する。
 2. デスクトップに作成された +Lhaca のショートカットに、
   対象のファイルをALTキーを押しながらドロップする。
 3. 保存場所を聞いてくるので、望みの場所を指定する。
   (圧縮形式は、相手が解凍できる形式を選ぶ。)
 4. 分割されたファイル群と結合用のバッチファイルが作成される。
   (デフォルトでは 1.2MB を上限として分割される。)
   (このサイズは +Lhaca で変更できる。)
 5. (4)のファイル全てを、容量を超えないようにメールに添付して送信
   する。
   (添付ファイル総数を本文に明記すること。)
 6. 受け取った側は、全ての添付ファイルを一箇所に集めて、バッチファ
   イルを実行する。
   (操作手順は、本文に明記すること。)
 7. 分割されたファイルが結合されるので、結合された圧縮ファイルを解
   凍する。
 8. 9MBのファイルが解凍されるので、作業する。


これでどうかな!?

※他の圧縮ソフトも分割機能が備わっていると思うが・・・

●大きなサイズのファイルを分割して送付

+Lhaca 1.20 デラックス版での分割方法
http://park8.wakwak.com/~app/Lhaca/

 1. インストールは、ダウンロードした Lhaca120.exe を実行する。
 2. デスクトップに作成された +Lhaca のショートカットに、
   対象のファイルをALTキーを押しながらドロップする。
 3. 保存場所を聞いてくるので、望みの場所を指定する。
   (圧縮形式は、相手が解凍できる形式を選ぶ。)
 4. 分割されたファイル群と結合用のバッチファイルが作成される。
   (...続きを読む

QC/C++言語で変数名から変数のアドレスを取得する方法があれば、ご教示願います。 例えばですが、関数

C/C++言語で変数名から変数のアドレスを取得する方法があれば、ご教示願います。

例えばですが、関数GetProcAddress()は、関数の文字列からエクスポート済みの関数のアドレスを戻り値で返しています。
GetProcAddress()と同じようにアドレスを取得したい変数名の文字列を渡して、変数のアドレスを取得したいです。

よろしくお願いします。

Aベストアンサー

無理です。

C/C++ はコンパイルした時点で変数名は捨てられて自動採番の識別子に置き換えられるので。

ただし、「どうしても変数名から」というときのために「マクロ引数の文字列化」を巧みに利用してそれらしい挙動をさせるためのコードはよく見ます。
詳しくはググってください。

参考になればよろしいんですが。

QNTFS圧縮したファイルを全部まとめて戻す方法

NTFS圧縮したファイルをプロパティからひとつひとつチェックをはずして戻すのではなく、圧縮されたファイルを全部まとめて元に戻す方法ってあるのでしょうか?

Aベストアンサー

圧縮を解除したいファイルを全て選択した状態で
→プロパティ→NTFS圧縮のチェックを外す→OK

それらのファイルがフォルダに入っているなら
フォルダのプロパティからやってもいい。
(サブフォルダにも適用するか尋ねられるからOKにする)

QC言語(UNIX)からVB・VC・C++に移植したことあるかた

C言語(UNIX)からVB・VC・C++に移植した
ことあるかたいませんか?
ある方がいらっしゃいましたら、移行の仕方等教えて下さい。その際注意点等ありましたらお願いします

Aベストアンサー

GUIを持ってるか否かで違います。
またGUIと内部処理が切り離されている場合なら、
GUIを持っていても移植は楽でしょう。

ソースを良く吟味して、

・OSに依存する部分・しない部分
・互換ライブラリのある部分・ない部分
・ライブラリに依存する部分・しない部分

に分けてください。
VCへの移植はOSに依存する部分を入れ替えてしまうことです。
DLLにしておけば、VBからも場合によっては使えるかも知れません。

非常に上手くこの作業を行えば、VC++のフレームワークで
ごく簡単にGUIを追加・移植出来るかもしれません。
無理にGUIにする必要ないならいいんですが。

C++へ移行するのに何か意味があるとお考えでしょうか?
保守の面で意味があるなら、仕様を再度分析した上で、
詳細設計の書き直しが必要です。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報