2012/06/24

C言語 パスを構造体で管理してみる

自分で使うアプリを少し作ろうかと思うのだが、一気にやる時間もないので、ちょろちょろパーツ単位で作って行こうと思う。C言語では意外と文字列の操作で引っかかったので、その部分を書いておく。

ドラッグ&ドロップでパスを取得し加工する

#include <stdio.h>
#include <string.h>
/* 構造体 各パスを管理 */
struct Path{
  char exepath[128];
  char filepath[128];
  char filepathNew[128];
  char inipath[128];
} path;

/* 構造体にパスを入れる関数 */
filepath(char *str0,char *str1){
   /* a.exe パスをコピー  */
   strcpy(path.exepath, str0);
   printf("filepath exepath \t%s\n",path.exepath);

   /* 新規ini用パスを作る*/
   strcpy(path.inipath, path.exepath);
   /* \0を入れて exe path から a.exe を切り捨てる */
   *(path.inipath + (strlen(path.inipath) - 5)) = '\0';
   /* 連結 */
   strcat(path.inipath, "hpf.ini");
   printf("filepath ini filepath \t%s\n",path.inipath);

   /* ファイルパスを構造体へ */
   strcpy(path.filepath, str1);
   printf("filepath filepath \t%s\n",path.filepath);

   /* 新規ファイルパスを作る */
   strcpy(path.filepathNew, path.filepath);
   /* ドット以下を切り捨てる */
   strtok(path.filepathNew,".");
   printf("filepath file cut \t%s\n",path.filepathNew);
   /* 連結 */
   strcat(path.filepathNew,"_new.wav");
   printf("filepath newfile \t%s\n",path.filepathNew);
}

/* メイン関数 */
int main(int argc, char **argv){

  printf("&argv[0] \t%s\n",argv[0]);
  printf("&argv[1] \t%s\n\n",argv[1]);

  /* 引数を渡す */
  filepath(argv[0],argv[1]);

  printf("\nmain exepath \t%s\n",path.exepath);
  printf("main filepath \t%s\n",path.filepath);
  printf("main newfile \t%s\n",path.filepathNew);
  printf("main ini \t%s\n",path.inipath);

  getchar();/* 一時停止 */
  return 0;
}
コンパイルした a.exe に適当なファイルをドラッグ&ドロップすると、以下のような表示をする。表示している内容は、a.exe自身の絶対パス、ファイルの絶対パス。あとは、a.exeと同じ階層に設置予定の設定ファイル hpf.ini の絶対パスをa.exeのパスから作り出す。またファイルを加工して新規にファイルを保存したいので、ファイルの絶対パスを加工して、新規ファイルの絶対パスを作り出す。

どういう方法がよいのか分からないので、現状の知識で適当に作ってみた。パスは構造体に保存して、他の関数からもアクセスすることを前提としている。構造体には、はじめポインタで文字列を扱っていたが、加工するとうまく行かなかった。とりあえず配列にして、大きさを指定することで問題が起きなくなった。ポインタの解釈がちゃんと出来ていないと痛感。
&argv[0]        C:\a.exe
&argv[1]        C:\16bit_stereo.wav

filepath exepath        C:\a.exe
filepath ini filepath   C:\hpf.ini
filepath filepath       C:\16bit_stereo.wav
filepath file cut       C:\16bit_stereo
filepath newfile        C:\16bit_stereo_new.wav

main exepath    C:c\a.exe
main filepath   C:c\16bit_stereo.wav
main newfile    C:c\16bit_stereo_new.wav
main ini        C:c\hpf.ini


C言語 ANSI C89 Meadow & MinGW GCC 目次