C++でnullで区切られたファイルを読み込む方法
C++で、nullで区切られたファイルや文字を読み込む方法を紹介します。
1.問題点
プログラムを起動したときのオプションパラメータを/proc/
a.outに"a b c"というオプションパラメータを付与して起動すると、cmdlineには
# cat /proc/<PID>/cmdline
./a.outabc
となり、プログラム名とパラメータが表示されます。
lessで開くと
# less /proc/<PID>/cmdline
./a.out^@a^@b^@c
となり、各パラメータはnull文字で区切られているようです。
この1行を表示させようと思い、下記のサンプルを作ってみました。
#include <iostream>
#include <unistd.h>
#include <fstream>
int main(int argc, char* argv[]) {
// プロセスIDを取得
pid_t pid;
pid = getpid();
// cmdlineのパスを生成
char str[100];
sprintf(str,"%s%d%s","/proc/", (int)pid, "/cmdline");
// ファイル読み込み
std::ifstream ifs(str);
char data[256];
while (ifs.getline(str, 256 - 1)) {
std::cout << str << std::endl;
}
return 1;
}
が、このプログラムを実行すると、
$ ./a.out a b c
./a.out
しか出力されず、nullで区切られたあとのオプションパラメータを出力できません。
ということで、nullで区切られたファイルを読み込む方法を紹介します。
2.nullで区切られたファイルを読み込む
nullで区切られたファイルを読み込むには、getline()の第3パラメータに区切り文字としてnull(\0)を設定します。
#include <iostream>
#include <unistd.h>
#include <fstream>
int main(int argc, char* argv[]) {
// プロセスIDを取得
pid_t pid;
pid = getpid();
// cmdlineのパスを生成
char str[100];
sprintf(str,"%s%d%s","/proc/", (int)pid, "/cmdline");
// ファイル読み込み
std::ifstream ifs(str);
char data[256];
while (ifs.getline(str, 256 - 1, '\0')) {
std::cout << str << std::endl;
}
return 1;
}
これでプログラムを実行すると、次のようにnullで区切られたあとの文字も表示されます。
$ ./a.out a b c
./a.out
a
b
c
3.参考サイト
参考サイトは下記です。ありがとうございました。
Posted by yujiro このページの先頭に戻る
トラックバックURL
コメントする
greeting