dポイントプレゼントキャンペーン実施中!

C言語でdatファイルから指定した行のデータだけを別データに取り出したいです。
具体的には2250000行ある中から10+225n ~ 225+225n (n=0.1.2....)行だけを取り出したいです。9行とばして225行取り出して、を繰り返す感じです。
プログラミング初心者で全く分からないので、助けてください。
急ぎで困っています。よろしくお願いします。

A 回答 (2件)

取り出すってどういう意味でしょう?プログラム内部で格納するっていう意味でしょうか?それとも単純に画面出力するだけ?また、それはC言語で作らなくてはいけないものでしょうか?



世の中にはいろいろなツールがあって、行を取り出すことを難なくやってくれるものがたくさんありますが、C言語で「1行を読む」って実は意外と難しいのです。データファイルには、「行」という概念でデータが格納されているのではなく、連続したデータの中で「改行文字」を区切りとして、この改行文字が現れるところまでを1行としましょう、という約束に従っているだけなのです。通常、改行文字は「\n」1文字、もしくは「\r\n」という文字列のいずれかです。C言語用の標準関数でも、行を取り出すfgets()というものが用意されていますが、1行の長さが不明(ある行は10文字かもしれないけど、100万文字の行があるかもしれない)だと、この関数も工夫して使わなくてはいけなくなります。理由は、一度にファイルから読む文字数は有限(よほどでかすぎない限り自分で決められます)だからで、一度に読めたデータの中に改行文字が含まれなければ、その行の続きをもう一度読んで、前のデータとくっつける、みたいなことをしなくてはいけないからです。

で、単純に、たとえば1行はN文字を超えることはないということが分かっていて、ただ画面に出力するだけでいい、ってことでしたら、サイズNのchar型の配列を作り、この配列を利用して、No.1の方のご回答にある「1行読む→1行出力」の部分を、fgets()とprintf()を使って比較的簡単に作ることができると思います。
    • good
    • 2

while(EOFになるまで) {


for(9回) { 1行読む→何もしない}
for(225-9回) { 1行読む→一行出力 }
}

とりあえずのエラー処理とかを考えなければ、上記の考えでできます。


Linuxが使えるのなら
https://linuxjm.osdn.jp/html/GNU_textutils/man1/ …
で225行で分割して、その分割されたファイルを
https://linuxjm.osdn.jp/html/gnumaniak/man1/tail …

https://linuxjm.osdn.jp/html/GNU_sed/man1/sed.1. …
で10行目以降だけ出力、というのが、プログラム不要です。
    • good
    • 0
この回答へのお礼

ありがとうございます。助かりました。

お礼日時:2017/12/27 21:29

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

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