- ベストアンサー
gccコンパイラのプログラムでファイルの特定行削除をしたい
初心者な質問で申し訳ありません。。 Linuxでプログラムの勉強をしています。 その中でファイルにデータを書込み、 あとでそこを検索してその行を削除するというプログラムを作成しており、そのためのCの関数リファレンスやいくつか書籍を調べてみたのですが、 ファイルから特定の行を削除するという具体的な方法を見つけることができませんでした。 今のところ現実的なのは 1.特定の行より前の行までを別のファイルに書き出し。(コピー) 2.特定の行より後ろの行以降を別のファイルに書き出し(コピー) 3.コピー元のファイルを削除する。 4.コピーしたファイルを3.で削除した名前に変える。 なのですが、これ以外の方法をご存知の方、御教授いただけますでしょうか? なお、Qtの勉強もかねてなのでコンパイラはgcc限定としております。
- nuno0920
- お礼率53% (23/43)
- C・C++・C#
- 回答数2
- ありがとう数1
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
1)作業領域が充分に取れるのなら ファイルを全部メモリーに読み込み特定の行を除いて上書きする。 2)読み込み位置と書き込み位置を記憶して 読み込み位置にseekして読み込み、書き込み位置にseekして書き込みを繰り返せば1行削除できる。 ファイルI/Oバッファが有効に働いていれば物理的な負荷は意外と小さいかも。
その他の回答 (1)
- asuncion
- ベストアンサー率33% (2126/6288)
> 具体的な方法を見つけることができませんでした。 現実的でわかりやすい方法をすでに見つけていらっしゃるではないですか。
関連するQ&A
- フリーコンパイラgccって?
(1)gccはlinux用のコンパイラですか? (2)gccはunix用のコンパイラですか? (3)gccでx-widowプログラムを作ることはできますか? (4)gccを入手するにはどうしたらいいのですか? (5)gccの特長を教えてください (6)gccでどのようなプログラムを作りましたか? どれか一つでも分かれば教えてください よろしくお願いします
- ベストアンサー
- C・C++・C#
- Ubuntって、CDブートで使ってもgccコンパイラは使える?
ちょっとプログラミングの勉強をしたくなり、Cコンパイラ環境を手軽に使えるLinuxを使おうと思っているのですが、空きのパソコンが手元にないのでCDブートのLinuxでCコンパイラの勉強をやりたいのですが、 UbuntはCDブート環境でもgccのCコンパイラを使うことは可能でしょうか?
- ベストアンサー
- Linux系OS
- windowsのコンパイラーで正しく実行されたのに、gccのコンパイラーでエラーがでた
windowsのコンパイラーで正しく実行されたのに、gccのコンパイラーでエラーがでたソースコードです。ファィル名test.c です。Linux(Red Hat9) gccです。windowsのコンパイラーはCPad for Borland C++Compilerです。 #include <stdio.h> void main() //intからvoidに変更した { int i, j; for (i=1; i<=9; i++){ printf("%2d ",i); //%2dで、iが2桁に表示 } printf("\n"); printf("***************************\n"); //この罫線もどきの書き方はダサいので工夫してください for (i = 1; i<=9; i++){ for (j = 1; j<= 9; j++) { printf("%2d ", i*j); if (j == 9) printf("\n"); //1行表示後改行 } } return; //voidにしたので0を取った! } これがLinux(RedHat9)gccでは以下のエラーが出ます。 (test.c: 関数 `main' 内: test.c:4: 警告: `main' の戻り値の型が `int' ではありません) なぜ、同じソースコードでエラーが起こるのですか? Linux gccでは、この場合`int' 以外の何が必要なのでしょうか? 以上よろしくお願いします。
- ベストアンサー
- その他(ソフトウェア)
- ファイルの中の特定の行だけを削除したい
あるファイルの特定の行だけを削除したいのですが、高速に行う方法はありませんか? とあるファイルがあり、これは数行~数万行にも及ぶ可能性のある大規模なファイルです。 このファイルの、特定の行を検索してその行だけ削除し、空いてしまった行は詰めたいのですが、どのようにすれば高速に行えますか? かなり遅い方法だと、 xxx = "hoge\n" arr = [] f = open("file") f.each{|line| if line != xxx then arr<<line end } f.close open("file", "w").puts arr.join() などが考えられるのですが、遅すぎて使えないはずです。 速度が求められる処理のため、困ってます。 もしご存じの方がいらっしゃいましたら、教えて頂けませんか?
- ベストアンサー
- Ruby
- gccプログラムで複数の実行ファイルを起動可能?
Ubuntu LinuxでTCPクライアント通信を行うプログラムをgccで作成しています。 現在、特定のサーバーに対して接続して数十秒ごとに1kバイト程度のパケットを送信するプログラムを1つ作りました。 その後、キーボードのキー入力に応じて、そのキー操作のログテキストファイルを出力プログラムも作りました。 それぞれのプログラムをgccでコンパイルして2つの実行ファイルが作成されました。 キー操作のログテキストファイルをの内容に応じてTCP通信側のプログラムが送信するパケットの内容を変えたいと思っているのですが、この場合片方の実行ファイルを起動した場合に、もう一つの実行ファイルも起動するようにするにはどうしたら良いかご教示頂けないでしょうか? どうぞ、よろしくお願い致します。
- ベストアンサー
- C・C++・C#
- Linux+GCCで、ソケットプログラム
お世話になっております。 Linux<-->Win間で、データ送受信するプログラムを作りたいと思っています。 現在は、Win<-->Win間でWinSockを使ったプログラムがほぼ完成していますが、次の方向性としてLinux<-->Win間ソケットプログラムなのです。将来的には、組み込みPCとしてつかいたいのです。 DOSの頃(8年前くらい)にC言語はやっていたので、C言語は多少は覚えていますが、Linuxを使った事が無い、GCCの経験が無いので、OSの選択やGCC(特にソケット)に関する勉強をしなければなりません。 そこで、こういったジャンルを勉強できる本を探しているのですが、皆さんのお勧めは無いでしょうか?
- 締切済み
- C・C++・C#
- gccのコマンド行オプションについて
現在仕事で、HP-UX11iからLinuxにC言語プログラムを移行する作業を行っています。 そこで、質問なのですが、HP-UXでは"+unum"というコマンド行オプションがありました。 以下がccのマニュアルに記載されている説明です。 ------------------------------------------------------------------------------- ポインタは固有に境界整列していないデータにアクセスできる。 このオプションを使用することにより、コンパイラが間接参照されたデータにアクセスする方法 が変更できる。 また、このオプションを使用すると、生成されたコードの効率が低下することがある。 numについては次のように指定可能。 1:シングルバイトの境界整列を想定する。一連のシングルバイトのロードと保管によって 間接参照が実行される。 2:一連の2バイトのロードと保管によって間接参照が実行される。 4:一連の4バイトのロードと保管によって間接参照が実行される。 ------------------------------------------------------------------------------- この様に、アラインメントの設定だと思うのですが、"gcc"のオプションで同じ性能を持つものってあるのでしょうか? ネットなどで調べても出てこないので、もしご存知でしたら、ご教授ください。 OSの環境、gccのバージョンは以下の通りです。 OS:Red Hat Enterprise Linux AS release 4 (Nahant Update 5) gcc:gcc (GCC) 3.4.6 20060404 (Red Hat 3.4.6-8) わかりにくい質問だとは思いますが、よろしくお願い致します。
- 締切済み
- C・C++・C#
補足
回答ありがとうございました。 補足させていただきますと、 1)は最終手段で考えています。 結構ファイルサイズが大きくなりそうなので・・・ 2)ですが、これはこの処理を繰り返した場合最後の行がどのようになるのかを お伺いしたいのですが。 (例えば先頭から2番目の行を1番目に書いていくという形であれば、最後の行は余ってしまうのかなと)