readがうまくできない。


上手くreadできません。

text.txt

[code]

    ABC
    
[/code]

main.c

[code]

    #include <unistd.h> 
    #include <stdio.h>
    #include <fcntl.h>
    #include <stdlib.h>
    
    int main()
    {
        int sz, fd = open("text.txt", O_RDONLY | O_CREAT);
        char *c = (char *)calloc(100 , sizeof(char));
        
        printf("%d\n", fd);
        sz = read(fd, c, 100);
        printf("called read(% d, c, sz).  returned that"
             " %d bytes  were read.\n", fd, sz);
        printf("%s", c);
        return 0 ;
    }
    
[/code]

これの出力が以下です

[code]

    3
    called read( 3, c, sz).  returned that 12 bytes  were read.
     ■A
    
[/code]

まず、ABC しか書かれてないのに 12byte 読んでるのは変だし、"ABC" と表示されないのもおかしいです。

これは Windows を使っているせいでしょうか？なお、コンパイラは mingw です。  
Linux で実行した場合は正常に動作しました。




Windows上の`text.txt`ファイルが、BOMおよび改行コード付きのUTF-16LEエンコーディングであれば、それは正しい動作です。

該当ファイルをマウス右クリック等でプロパティを確認すれば、サイズが12バイトになっているでしょう。

そのファイルを16進数でダンプ表示すると、以下のようになるはずです。

[code]

    FF,FE,41,00,42,00,43,00,0D,00,0A,00,
    
[/code]

Windows上のC言語での`char`は8bitで、printfの%sは0x00で終端されるcharの配列であるモードで使われていたのでしょう。  
ファイル読み取りのサイズはバイト単位で通知されます。

そのため、読み取ったサイズは12バイトだし、`printf("%s", c);`では`FF,FE,41`までが出力対象で、`
■A`のように表示されます。(ちなみにVC++のコンソールアプリで(動くように修正して)やってみたら、`A`と表示された(Aの前は実際には中点`・`のように見えました)ので`FF,FE`の表示に関しては環境依存の可能性が大きいかもしれません)

* * *

Linux上で上手くいったのは、Linux上で使用した`text.txt`ファイルがWindows上の物とは違っていた(ASCII/ShiftJIS/UTF-8BOM無しで、改行コード無し)のだと思われます。




Windows上の`text.txt`ファイルが、BOMおよび改行コード付きのUTF-16LEエンコーディングであれば、それは正しい動作です。

該当ファイルをマウス右クリック等でプロパティを確認すれば、サイズが12バイトになっているでしょう。

そのファイルを16進数でダンプ表示すると、以下のようになるはずです。

[code]

    FF,FE,41,00,42,00,43,00,0D,00,0A,00,
    
[/code]

Windows上のC言語での`char`は8bitで、printfの%sは0x00で終端されるcharの配列であるモードで使われていたのでしょう。  
ファイル読み取りのサイズはバイト単位で通知されます。

そのため、読み取ったサイズは12バイトだし、`printf("%s", c);`では`FF,FE,41`までが出力対象で、`
■A`のように表示されます。(ちなみにVC++のコンソールアプリで(動くように修正して)やってみたら、`A`と表示された(Aの前は実際には中点`・`のように見えました)ので`FF,FE`の表示に関しては環境依存の可能性が大きいかもしれません)

* * *

Linux上で上手くいったのは、Linux上で使用した`text.txt`ファイルがWindows上の物とは違っていた(ASCII/ShiftJIS/UTF-8BOM無しで、改行コード無し)のだと思われます。

