文字列をヒープ領域にあるバッファーにコピーするのは良くある作業かと思います。
ファイルからデータをコピーする場合は、ファイルサイズが大きくなると事を考えてヒープ領域に割り当てるすることが多いと思います。
それで文字列の場合は 0 初期化をしていると便利なので malloc() でなく calloc() を使うと便利です。
それ以外は前の項目とやってることは同じなので、ちゃっちゃと実装例を見てきましょう。
1 #include <stdio.h> 2 #include <fcntl.h> 3 #include <stdlib.h> 4 #include <unistd.h> 5 6 int main() 7 { 8 char *buf; 9 int fd, size; 10 11 buf = (char *) calloc(100, sizeof(char)); 12 13 fd = open("test.txt", O_RDONLY); 14 if (fd < 0) { 15 perror("ファイルを開けませんでした"); 16 exit(1); 17 } 18 19 size = read(fd, buf, 99); 20 printf("fd: %d sz: %d\n", fd, size); 21 buf[size] = '\0'; 22 printf("%s\n", buf); 23 24 close(fd); 25 free(buf); 26 27 return 0; 28 }
ビルドと実行結果.
$ echo "abcde12345" > test.txt $ gcc main.c $ ./a.out fd: 3 sz: 11 abcde12345
「test.txt」にまずデータ「abcde12345」を設定してからビルドしてますね。
11 buf = (char *) calloc(100, sizeof(char)); 12 13 fd = open("test.txt", O_RDONLY); 14 if (fd < 0) { 15 perror("ファイルを開けませんでした"); 16 exit(1); 17 }
buf が読み取ったデータをコピーするバッファーです。
calloc() が使われてますね。
この場合 100 個の char 型を保管する領域がヒープに確保されます。
そして「text.txt」を読み込みオンリーの制約で開きます。
19 size = read(fd, buf, 99); 20 printf("fd: %d sz: %d\n", fd, size); 21 buf[size] = '\0'; 22 printf("%s\n", buf);
出力は以下のようになります。
fd: 3 sz: 11 abcde12345
read 関数は 99 バイト読み込もうとします。
ファイル記述子 fd は3ですね。
size は 11 バイトを読み込んでます。
この最後の後ろのところに 0 終端文字を追加しているので、printf で出力が可能となっていますね。
Copyright 2018-2019, by Masaki Komatsu