20.1. 文字列をヒープにコピー

 文字列をヒープ領域にあるバッファーにコピーするのは良くある作業かと思います。

 ファイルからデータをコピーする場合は、ファイルサイズが大きくなると事を考えてヒープ領域に割り当てるすることが多いと思います。

 それで文字列の場合は 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