掲示板ランキング  プラスター(微香・無臭タイプ)  プラスター(肌にやさしい)


掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板1

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧

No.7240

バイナリーモードとテキストモードによるファイルの入出力について
投稿者---エモシオン(2007/03/17 14:59:39)


コンパイラはBorland C++Compiler 5.5でOSはwindowsです。

今まで、linux環境でプログラムをしていたのですが、新しくwindows環境でプログラムをしているときに気がついたことについての質問をさせていただきたいと思います。
以下のプログラムをコンパイルして実行するとint型ではうまく表示できないのですがdouble型ではうまく表示できているのはなぜなのでしょうか。

int型でうまく表示されないのはOSがlinux等のUNIX系OSではないため改行ードの変換が行われているためだと思うのですが、それでいいのでしょうか。
また、それが正しいとすると、たまたまdouble型だとうまく表示されているだけなのでしょうか。

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
        FILE *fp;
        int outbf[10] = {8,9,10,11,12,13,14,15,16,17};
        int inbuf[10];
        double out[10] = {8.1,9.2,10.3,11.4,12.5,13.6,14.7,15.8,16.9,17.0};
        double in[10];
        int i;
        char s[20]="int.dat", ss[20]="double.dat";
        
        
        /* ファイルをテキスト書き込みモードでオープン */ 
        if((fp = fopen(s, "w")) == NULL ) {
                printf("ファイルオープンエラー\n");
                exit(1);
        }

        /* ファイルにデータを書き込み */
        printf("int型のデータの書き込み\n");
        printf("fwrite :%d個データを書き込み\n", fwrite(outbf, sizeof(int), 10, fp) );
        
        fclose(fp);

        for (i=0; i<10; i++)
                printf("%d ",outbf[i]);
        printf("\n");
        
        /* ファイルをバイナリ読み込みモードでオープン */
        if((fp = fopen(s, "rb")) == NULL ) {
                printf("ファイルオープンエラー\n");
                exit(1);
        }       
        /* 書き込んだデータを読み込んでみる */
        printf("バイナリモードfread :%d個データを読み込み\n", fread(inbuf, sizeof(int), 10, fp));
        
        fclose(fp);

        for (i=0; i<10; i++)
                printf("%d ",inbuf[i]);
        printf("\n");
        
        printf("\n");
        
        /* double型で保存 */
        /* ファイルをテキスト書き込みモードでオープン */
        if((fp = fopen(ss, "w")) == NULL ) {
                printf("ファイルオープンエラー\n");
                exit(1);
        }

        /* ファイルにデータを書き込み */
        printf("double型のデータの書き込み\n");
        printf("fwrite :%d個データを書き込み\n", fwrite(out, sizeof(double), 10, fp) );
        
        fclose(fp);
        
        for (i=0; i<10; i++)
                printf("%f ",out[i]);
        printf("\n");
        
        /* ファイルをバイナリ読み込みモードでオープン */
        if((fp = fopen(ss, "rb")) == NULL ) {
                printf("ファイルオープンエラー\n");
                exit(1);
        }       
        /* 書き込んだデータを読み込んでみる */
        printf("バイナリモードfread :%d個データを読み込み\n", fread(in, sizeof(double), 10, fp));
        
        fclose(fp);
        
        for (i=0; i<10; i++)
                printf("%f ",in[i]);
        printf("\n");

        return 0;
}



この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:バイナリーモードとテキストモードによるファイルの入出力について 7242 Hermit 2007/03/17 17:10:42


No.7242

Re:バイナリーモードとテキストモードによるファイルの入出力について
投稿者---Hermit(2007/03/17 17:10:42)


>以下のプログラムをコンパイルして実行するとint型ではうまく表示できないのですがdouble型ではうまく表示できているのはなぜなのでしょうか。
double のデーター中に、たまたま 0xA がないのでうまくいっただけです。
int のデーターの方でも、10 を他の数値に変えてやればいいだけだと思われます。
>int型でうまく表示されないのはOSがlinux等のUNIX系OSではないため改行ードの変換が行われているためだと思うのですが、それでいいのでしょうか。
多分それだけでしょう。


この投稿にコメントする

削除パスワード

No.7244

Re:バイナリーモードとテキストモードによるファイルの入出力について
投稿者---エモシオン(2007/03/17 20:54:59)


返信ありがとうございます。

>double のデーター中に、たまたま 0xA がないのでうまくいっただけです。
>int のデーターの方でも、10 を他の数値に変えてやればいいだけだと思われます。
確かに、10を他の数字に変えるとうまくいきました。

これまでは、改行文字だけが選択的にオープンモードの違いによって変更される
と考えていました。しかし、これは正しくなくて、windowsではファイルオープンの
モードによって、書き込むときに0xAが足され、読み込むときは0xAが消され、
Linux等のUnixOSではこのような操作がないという理解でよろしいのでしょうか。


この投稿にコメントする

削除パスワード

No.7262

Re:バイナリーモードとテキストモードによるファイルの入出力について
投稿者---Hermit(2007/03/18 19:26:51)


>これまでは、改行文字だけが選択的にオープンモードの違いによって変更される
>と考えていました。しかし、これは正しくなくて、windowsではファイルオープンの
>モードによって、書き込むときに0xAが足され、読み込むときは0xAが消され、
>Linux等のUnixOSではこのような操作がないという理解でよろしいのでしょうか。

コンパイラの方針によって違うとは思いますが、
大体そんな感じが多いですね。
DOS 系統(Windows系統)だと、テキストモード時、Ctrl+Z も見ていると思われますが。

Unix系の場合は、大体の事はデバイスドライバなどがやってくれているから省略できているだけなので、
DOS系でも、そういうドライバにしてしまえば、必要ないので、コンパイラライブラリを変える事で変更できるかも。

基本的には、テキストを読み書きするためのモードか、
その他のデーターとして読み込むモードかどうかというだけですので、

テキストは、Unix 系は、LF だけど、他は CR が多かったので、
DOS 系統まで入って結構面倒臭い事になってます。


この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧





掲示板提供:(有)リアル・インテグリティ