ファイル(データ)のコピー方法と速度比較

このQ&Aのポイント
  • ファイル(データ)のコピー方法と速度比較について説明します。
  • C言語初心者がテキストファイルのコピーをファイル単位とバイナリ単位で行う方法について質問しています。
  • 具体的なコーディング方法と実行時間の計測についてアドバイスを求めています。
回答を見る
  • ベストアンサー

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

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

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

  • ベストアンサー
noname#25358
noname#25358
回答No.1

 「ファイル」と「バイナリ」は対語ではありませんので、混乱なさるのも無理のないことです。  「ファイル」とは、ディスク上にある情報単位、「バイナリ」とは、そのファイルの内部形式ですので、「ファイル」というものの種類の1つとして「バイナリファイル」というものがあることになります。  よってこの場合、「テキスト形式とバイナリ形式ではどっちが速いでしょう」という設問にすべきです。  やり方としては、オープン時に、   fopen( "www.txt", "r" );  こうするとテキスト形式での読み込み、   fopen( "www.txt", "rb" );  こうするとバイナリ形式での読み込みになります。  テキスト形式では、fgets() 関数での読み込み時に、改行のところまでで読み込んでくれたり、改行文字を2バイトから1バイトへ変換してくれたりする機能が付加されますので、理論上はそのような変換処理のないバイナリ形式の方が高速です。  もっとも最近のパソコンだと、ミリ秒で計測しても違いが分からないかもしれません……(^_^;

mahada_sv
質問者

お礼

回答して頂き、ありがとうございます。 >「テキスト形式とバイナリ形式ではどっちが速いでしょう」という設問にすべきです。 これは、テキストファイルをコピーする場合という意味ですよね? それならば理解できるのですが、他のファイル形式(例えばexeファイルとか)を コピーする場合にはどうなのでしょう? 同じなのでしょうか?

その他の回答 (1)

noname#25358
noname#25358
回答No.2

 最初からバイナリ形式で記録されているファイルを、テキスト形式でコピーしてはいけません(^_^;  テキストの読み込み/書き込みでは、改行文字に関する処理が自動的に付加されるため、バイナリファイルをテキスト形式でオープンすると内容が破壊されるためです。  テストとして仮にそういうプログラムを組むとしたら、しょせんデータはデータです。テキストファイルと変わりません。

mahada_sv
質問者

お礼

ありがとうございます。 おかげさまで頭の中がすっきりしました。

関連するQ&A

  • テキストファイルをバイナリファイルに変換

    -32768, -32768, -32768, -32768, -32768, -32768, -32768, -32768, -32768, -32768, 130, 120, 120, 109, 100, 100, 94, 91, 90, 89, 87, -32768, 78, 71, … と続いていくテキストファイルのデータをバイナリデータにC言語で変換したいのですが、どうすれば変換出来るのでしょうか。

  • 改行コードの謎

    現在、VisualStudioを使ってCプログラムを作成してるのですが、ファイルについて質問があります。 あるテキストデータをfopen()でオープンし、その後fread()を使ってデータを取得しそのメモリをデバッガで参照すると改行がLFのみになっているですがこれはなぜなのでしょうか? バイナリエディタで参照すると改行はCRLFなのですが...。

  • freadとfwrite

     C言語初心者です。 fopenでテキストファイルで読み込んで,freadやfwriteなどは使っていいのでしょうか? 入門書などでは、freadやwriteはバイナリファイルでしか使っていないので疑問になりました。

  • バイナリファイルに改行コードを追加したい

    C言語でマルチバイト文字(全角文字)を含めたバイナリファイル(改行のないテキストファイル)に指定したバイト長ごとに改行コードを追加するにはどのようにしたら良いのでしょうか?。 漠然とですがfopen()とfread()などを使うんだろうと おもうのですが、読み込んだ文字数の計算方法がわかりません。 どなたかご教授お願いします。

  • PHPでexeファイル実行

    C言語でMPG形式の画像ファイルを読み込み、画像処理をしてテキスト形式で画像データを出力するプログラムを作成したのですが、 これをPHPプログラム内で動作させ、テキストデータ(できればバイナリのほうがいい)を読み取りたいと思います。 これはexeファイルをexecやsystem関数で実行することで解決できるのでしょうか? また、C言語の画像処理プログラムが画像を読み込んでからテキストデータを作成するまで1分ほどのタイムラグがあります。 どうすればPHP内の処理でexeファイル実行→exeがデータベースから画像を読み込む→ 1分処理待ち→テキスト作成→作成されたテキストデータをPHPで読み込み とできるのでしょうか? ちなみに、exeファイルとphpで作成した画像データベースはサーバー機に置くつもりです。 テキストデータを介さなくても、C言語プログラムからphpに直接データを渡す方法があればそちらのほうが望ましいです。 連続投稿で申し訳ないのですが、急を要するのでぜひともご解答お願いします。

    • ベストアンサー
    • PHP
  • テキストファイルのデータからバイナリを作りたい

    現在、テキストデータとしてCSVファイル1つあたり8バイトのデータが1000個ほどのデータが書かれているファイルがあります。このデータをバイナリファイルへ数値も変換して行きたいと思っています。 たとえば1個目のデータ”12345678”というテキストデータをバイナリの"12345678"に変換したらそれを0x00番地に並べて、そして2個目のデータ”87654321”というデータをバイナリにしたらそれを0x90離れた場所に置いていき、それを1000回繰り返して、結果をバイナリファイルで出力したいのですが、何か簡単にできるフリーソフトなどありませんでしょうか? また、プログラムとかでも簡単にできるのならそうしたいのですが、どうしたらよいか教えていただけないでしょうか?

  • コーディングについて。

    コーディングとは、コンピュータにコード入力する事を言います。 転じてプログラミングの意味で使われますが、プログラムコードを書くこと全般を言います。 プログラムコードはふつうソースコードと呼びます。 ソースコードとは普通はテキストファイルの形で保存されるコードのことです。 アセンブリ言語もテキストファイルに書き込んでゆきます。 マシン語は、基本的にはテキストファイルではなく、実行形式のバイナリファイルそのままをバイナリエディタや専用エディタで編集します。 C言語中のインラインアセンブラのように、そこにマクロ命令でマシン語を書き込む事も出来るには出来ます。 勿論、マクロアセンブラ(MASM)のようなアセンブリ言語でもマクロ命令でマシン語コードを記述出来ます。 大昔まで言えば、穿孔テープを使っていた頃のコンピュータなら、テープに穴を空ける作業もコーディングです。 穿孔テープは穴の有無を2進数で示していて、そこに必要に応じてチェックサムなどを付けたものですが、これは紛れもなくマシン語です。 これら全てを総じてコーディングと呼びます。 ですから、アセンブリ言語もマシン語もそれを書くことはコーディングです。 以下四つの質問に答えていただけると幸いです。 ①テキストファイルとは何でしょうか? ② マシン語は、基本的にはテキストファイルではなく、実行形式のバイナリファイルそのままをバイナリエディタや専用エディタで編集します。 C言語中のインラインアセンブラのように、そこにマクロ命令でマシン語を書き込む事も出来るには出来ます。 勿論、マクロアセンブラ(MASM)のようなアセンブリ言語でもマクロ命令でマシン語コードを記述出来ます。 ここの意味がわかりません。もう少し詳しく教えて頂きたいです。 ③チェックサムとは何でしょうか? よろしくお願いします。 と ④テキストは文字コードが割り当てられた、16進数でいう0x20~7f のものです。 マシンコードは8bitなら全部 0x00~oxff 全部の値があり得ます よろしくお願いできればと思います。

  • ファイルオープン&ファイルクローズ

     C言語でデータの種類ごとにディレクトリーを用意し、データを振り分けたいのですが。。  fopenすると同じディレクトリーでしかファイルを呼び出したり、保存したりしかできないですよね。ちがうディレクトリーのファイルの呼び出し、ファイルの保存は出来ないでしょうか?また、ディレクトリーの作成なんてことは、C言語ではできないでしょうか?  誰か知っている人がいましたら、よろしくお願いします。

  • ファイルコピープログラムについて

    まだC言語とか始めたばかりであまりよく分からないのですが、 今、ドラッグしたファイルをデスクトップにコピーするプログラムを作成してるのですが、少し困ったことになりました・・・・ 一応ファイルのコピーをデスクトップに作成はできるのですが、 何故か、作成されたファイルのサイズが2バイト程大きくなります・・・。 ファイルサイズを変えずにコピーする方法が分かりません・・・ ソースを張っておきますので、誰か解決策を教えていただけないでしょうか? #include <stdio.h> #include <windows.h> int main(int argc,char *argv[]) { FILE *fp,*copy; int buf; if(argc>1){ rename(argv[1],"DATA.bin"); fp=fopen("DATA.bin","rb"); copy=fopen("c:/xxx/yyy/Desktop/COPY.bin","wb"); while(1){ fread(&buf,sizeof(buf),1,fp); fwrite(&buf,sizeof(buf),1,copy); if(feof(fp)){ puts("OK"); fclose(fp); fclose(copy); rename("DATA.bin",argv[1]); rename("COPY.bin",argv[1]); exit(1); } } } return 0; }

  • バイナリファイルの編集

    stirling,bzなどのエディタを用いて、バイナリファイルを編集しようとしています。 テキスト(a.txt)のデータをバイナリファイルにコピペしようとしたのですが・・・ テキストで「ff ff ff ff」と書いてあったデータが、バイナリファイルにコピペすると「4646~」というように変換されてしまいました。 バイナリファイルでも「ff ff ff ff」とコピーしたい場合はどのようにすれば良いのでしょうか?

専門家に質問してみよう