• ベストアンサー

4Gバイトのファイルを開くには?

C初心者です。 稼動環境はUNIX(AIX)です。 4Gバイトのテキスト・ファイルを処理しなければならないのですが、fopen()を使用すると、エラーが出て開くことができません。 動的にメモリを割り当てればよいのかな?と思いますが具体的な方法がわかりません。 どなたか教えていただけますか?

質問者が選んだベストアンサー

  • ベストアンサー
  • hofuhofu
  • ベストアンサー率70% (336/476)
回答No.4

こっちのほうがいいですね。 AIX 4.3のドキュメントが元ネタになっているようです。 http://www.llnl.gov/asci/platforms/bluepac/large_file_prog.html

参考URL:
http://www.llnl.gov/asci/platforms/bluepac/large_file_prog.html
全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (3)

  • hofuhofu
  • ベストアンサー率70% (336/476)
回答No.3

fopen64は使えませんか? 32ビット環境では2GBあたり(longで扱える限界)に壁があります。 64が後ろについた関数を使うことで64ビット相当にまで拡大することができます。 http://ac-archive.sourceforge.net/largefile/libc.html

参考URL:
http://ac-archive.sourceforge.net/largefile/libc.html
全文を見る
すると、全ての回答が全文表示されます。
  • bikkuri
  • ベストアンサー率33% (23/68)
回答No.2

以前にも同様の質問がありました。(C++では無いかもしれない) その時は、open64で解決したように書いてあったかと

全文を見る
すると、全ての回答が全文表示されます。
回答No.1

fopen()は、ファイルを読み込むのではないのでどんな大きなファイルでもopenできるはずです。エラーになるのは別の理由だと思います。何のエラーが出ているのでしょうか? 通常大きいファイルの場合には、openして少し読み込んでファイルポインタを移動してまた読み込んでというように処理をします。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • ファイル(データ)のコピー

    C言語初心者です。 昨年末、C言語の講習時に友人に「例えば100Kくらいのテキストファイルを とあるメモリにコピーする場合、ファイル単位でコピーするのと バイナリ単位でコピーするのはどっちが早いでしょう~?」みたいな ことを言われました。 考えてもよく分からなかったので、実際にコーディングをして実行時間を 計ってみようと思ったのですが、ファイル単位とバイナリ単位でデータを コピーするには具体的にどのようにしたらよいのでしょうか? fopenでテキストファイルをオープンして内容を読み込み、 読み込んだデータをfopenで新規ファイルへ書き込む。 この方法だと、バイナリ単位ということになるのでしょうか?

  • C++でのファイル読み書き

    C++でのテキストファイルの読み書き方法は、具体的にCとどう違うのでしょうか? やはり、Cでいう「fp = fopen("text.txt",r)」みたいに書くのでしょうか? どのようなコードを書くのか知りたいです。よろしくお願いします。

  • 大きいサイズのファイルの扱い方 UNIX AIX

    お世話になります。 UNIX(AIX)環境での大きいサイズのファイルの扱いについての質問です。 viで大きいサイズ(500MBくらい)のテキストファイルを 開きたいのですが、マシンのメモリ不足で開くことができません。 このような大きいサイズのファイルを 大雑把にわけたい(3等分とか、5等分とか)のですが どのような方法があるか?教えてください。 (マシンの性能を上げる!という解答以外でおねがいします。) wcコマンドで全体の行数を調べようとしても、エラーが帰ってきてしまって調べられません。 headコマンドで頭から100行出力しようとしてもエラーが帰ってきます。 tailコマンドを使えば、ファイルの終端から、サイズを決めて出力することは、できます。 tailコマンド使用例 tail -k 50000 AAA.txt > BBB.txt

  • ファイルを開く処理

    ご質問です。 ファイルを開く処理が分からないです。 fopenでファイル処理を行うのではなく、 ただ単に、ファイルを開きたいのです。 例えますと、 IEをダブルクリックして画面の最前面に出てくるように・・・ こんな事は可能なのでしょうか? Cの実行ファイルと同等のディレクトリtest.htmlが存在し、それを開きたいのです。 普通にフォルダを開いてファイルをダブルクリックすればいいのですが・・・ この先には、ローカルのみでフォームを用いて入力した値をテキストに書き込む処理を行いたいと思います。 初心者のため、なかなか進まないのですが、googleで調べながやっております。 何かこれにまつわる良いサイトをご存知でしたらこれも併せて教えていただけたら幸いです。 よろしくお願い致します。

  • ファイル比較抽出とWindowsとのファイル連携方法

    こんにちは、UNIX上で行うファイル比較とWindowsとのファイル連携について わからない事があり、ご教示頂きたく投稿致します。 毎日1回、テキストファイルを比較してもし差分があれば 管理者に解る形で抽出させる、という処理を行いたいのです。 環境は以下の通りです。 192.168.1.0/24のセグメント内のあるWindows2003Serverにおいて、 比較対象のファイル(AAAA.txtとする)は以下の場所に日々保存される。 例えば2005年4月1日には C:\Switch\configs\2005\04\01 というディレクトリ配下にAAAA.txtが作成される。 4月2日ならばC:\Switch\configs\2005\04\02配下にAAAA.txtが作成される。 当日のAAAA.txtと前日のAAAA.txtを比較抽出する処理を、毎日自動で行いたい。 例えば2005年4月10日だと C:\Switch\configs\2005\04\10配下のAAAA.txtと C:\Switch\configs\2005\04\09配下のAAAA.txtを比較することになる。 そして比較抽出を処理するのはUNIX端末(そのWindowsサーバと同セグメント)である。 ポイントは、 ・比較したいファイルの場所(ディレクトリ)が日々、日付によって変動する ・そのファイルはWindows2003Serverが稼動しているサーバ内にある ・そのファイルをUNIX(例えばBSD)が稼動している端末から参照し、  毎日任意の時間に比較・抽出したい というところかと思うのですが、どういう手段がベストでしょうか。 UNIXに疎い私なりに調べたところ、 diffとsortコマンド、そして「samba」と「クーロン」というツールがあれば 可能かと思うのですが、如何でしょうか。 スクリプトをどう書くかなど、具体的な手法をご教示頂ければ幸いです。 よろしくお願い致します。

  • C言語のfopenについて教えてください。

    C言語のfopenについて教えてください。 ある1つのファイルをr(テキストファイル読み込みモード)でfopenしたとします。 そのファイルをfcloseする前に、同じファイルが再度rモードでfopenされても問題ないのでしょうか? 何を気にしているかと言いますと、あるプログラムであるファイルをrモードでfopenして読み込む処理があるのですが、そのプログラムを呼び出す処理が複数あります。 確率は低いと言えど、もし同時にその処理が実行された場合、rモードでfopenしているファイルにfclose前に再度rモードのfopenがされたらエラーとなってしまうのでしょうか? もし、エラーとなる場合、回避する方法がありますか? また、エラーとならない場合は、fcloseするまで次の処理が待ってしまうのでしょうか? 読み込みモードだから問題ないのかなとも思ったのですが、どなたかご存知だったら教えてください。 よろしくお願いしますm(_ _)m

  • SHARPのポケコンのPC-G850のfopen関数でテキストファイル

    SHARPのポケコンのPC-G850のfopen関数でテキストファイルを読み込むことは出来ないのですか?

  • 2バイト読飛ばして、スペースに置き換えたいです

    Cで、改行がないテキストファイルを800バイト毎に改行を入れることは無事できたのですが、254バイト目と255バイト目に化けている文字があり、それを半角スペース2つに置換したいのですがどうすればよいでしょうか? #include <stdio.h> int main() { FILE *f1,*f2; int i=0; char c; f1 = fopen("afile.txt", "r"); f2 = fopen("bfile.txt", "w"); if (f1 && f2) { while(!feof(f1)) { fscanf(f1, "%c", &c); fprintf(f2, "%c", c); i ++; if (i == 800){ i=0; fprintf(f2, "\n"); } } fclose(f2); fclose(f1); } }

  • 0byteデータの送信と受信

    現在unixでsocketプログラムを書いています。 FTPライクなプログラムを書いているのですが、ファイルを送受信する場合、ファイルの終端をどうするかを考えています。 ファイルサイズを送るのはなしです。 sendで0byteのデータを送り、recvで0byteのデータを受信した場合にファイルの終端に達したとして処理を終らせたいと考えています。 実際、sendでは0byteのデータを送信してもエラーにはなりませんが、recvでは受信できません。 そのような処理はできるのでしょうか? よろしくおねがいします。

  • ファイル末尾10バイトを削る

    ファイルを開き、末尾10バイトを削り、上書きする というプログラムを作成しています。 とりあえず、以下のようなソースが出来ました。 ------------------------------------------------------------------ ifp = fopen( "openfile.dat", "rb"); ofp = fopen( "outfile.dat", "wb" ); fseek( ifp, -10, SEEK_END ); pos_end = ftell( ifp ); fseek( ifp, 0, SEEK_SET ); for( pos_now = ftell( ifp ) ; pos_now < pos_end; pos_now = ftell( ifp )){    rCnt = fread( pbuf, sizeof( char ), 1, ifp );    f( rCnt == EOF ) break;    fwrite( pbuf, sizeof( char ), 1, ofp ); } fclose( ifp ); *(openfile削除) *(リネーム処理:outfile.dat -> openfile.dat) 以下略 ------------------------------------------------------------------ ソースにあるとおり、 ファイルを開く -> ファイルの末尾10バイト目を記憶する。 -> アウトファイルを開く -> 記憶した位置までコピーする -> オープンファイルの削除 -> リネーム処理 という順番で処理を行っています。 本来は、 ファイルを開く -> ファイルの末尾10バイト目にEOFをいれる -> ファイルを閉じる みたいな感じでやるつもりだったのですが、うまくいきませんでした。 後者のやり方や「私ならこうする!」等アドバイスがありましたら、是非お聞かせください。 よろしくお願いします。