Windwos 環境にて c 言語のソースコードを GCC でコンパイルして GDB でデバッグをしようとした際に、.gdbinit の自動読込が拒否されて意図したようにデバッグができない問題に遭遇した。
コンソールに表示されたメッセージの通りに対処しても問題を解決できなかったが、最終的に、それと同時に環境変数を追加することで解決できた。
Windwos 環境にて c 言語のソースコードを GCC でコンパイルして GDB でデバッグをしようとした際に、.gdbinit の自動読込が拒否されて意図したようにデバッグができない問題に遭遇した。
コンソールに表示されたメッセージの通りに対処しても問題を解決できなかったが、最終的に、それと同時に環境変数を追加することで解決できた。
1.
2.
3.
case EN_SETFOCUS:
PostMessage(GetFocus(), EM_SETSEL, 0, -1);
break;
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
// Borland C++ Compiler 5.5 にてコンパイル
#include <windows.h>
int WINAPI WinMain(HINSTANCE hCurInst, HINSTANCE hPrevInst,
LPSTR lpsCmdLine, int nCmdShow)
{
TCHAR ss[256];
INT i;
MessageBox(NULL,lpsCmdLine,TEXT("lpsCmdLine"),MB_OK);
MessageBox(NULL,GetCommandLine(),TEXT("GetCommandLine"),MB_OK);
wsprintf(ss,"%d",__argc);
MessageBox(NULL,ss,TEXT("__argc"),MB_OK);
for(i=0; i<__argc; i++)
{
wsprintf(ss,"%d\n%s",i,__argv[i]);
MessageBox(NULL,ss,TEXT("__argv"),MB_OK);
}
return 0;
}
direct.hをincludeすればいい。1.
2.
#include <direct.h>
int mkdir(const char *pathname);
1.
2.
#include <direct.h>
int rmdir(const char *pathname);
1.
2.
#include <direct.h>
int chdir(const char *pathname);
main関数の引数からexeファイルのパスを取得し、そのパスを使って絶対パスでファイル名を指定するようになった。chdirを使えばこれまで通りファイル名だけでも意図した通りのディレクトリにファイルを作ることができる。1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
#include <stdio.h>
#include <direct.h>
#include <windows.h> // GetCurrentDirectory
int main(void)
{
char s[256];
GetCurrentDirectory(255,s);
printf("current : %s\n", s);
// ディレクトリ削除
printf("del dir\n");
if( rmdir("dir") != 0 )
{
perror("rmdir");
}
// ディレクトリ作成
printf("make dir\n");
if( mkdir("dir") != 0 )
{
perror("mkdir");
}
// カレントを作成したディレクトリに変更
printf("chenge dir\n");
chdir("dir");
GetCurrentDirectory(255,s);
printf("current : %s\n", s);
// 1つ上の階層(元のカレントディレクトリ)へ
printf("chenge dir\n");
chdir("../");
GetCurrentDirectory(255,s);
printf("current : %s\n", s);
{
char c;
c = getchar();
}
return 0;
}
関数statを使えばいい。1.
2.
#include <sys/stat.h>
int stat(const char *pathname, struct stat *sbuf)
stat構造体はsys/stat.h内で定義されている。stat構造体のメンバの型はsys/types.h内で
typedefされている。1.
2.
3.
4.
5.
6.
7.
8.
9.
struct stat
{
/*stat構造体メンバの一部*/
mode_t st_mode; // short ファイルモード
off_t st_size; // long ファイルのサイズ
_TIME_T st_atime; // time_t 最後にアクセスされた時刻
_TIME_T st_mtime; // time_t 最後に修正された時刻
_TIME_T st_ctime; // time_t 最後に属性変更された時刻
};
st_modeをS_IFMTでマスクすることで、それがファイルなのかディレクトリなのかを判断することができる。1.
2.
3.
4.
5.
6.
7.
8.
9.
switch( s.st_mode & S_IFMT )
{
case S_IFREG:
ファイルの時の処理;
break;
case S_IFDIR:
ディレクトリの時の処理;
break;
}
1.
2.
#define S_ISDIR(mode) ((mode&S_IFMT) == S_IFDIR)
#define S_ISREG(mode) ((mode&S_IFMT) == S_IFREG)
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
#include <stdio.h>
#include <time.h>
#include <sys/stat.h>
int main(int argc,char *argv[])
{
int i;
if(argc == 1)
{
printf("don't file inputed\n");
return 0;
}
for(i=1; i<argc; i++)
{
struct stat fileStat;
time_t t;
// 入力ファイルの情報を取得
if( stat(argv[i],&fileStat) != 0 )
perror("argv[i]");
// ファイルのモード
switch( fileStat.st_mode & S_IFMT )
{
case S_IFREG: // ファイル
printf("this is file\n");
break;
case S_IFDIR: // ディレクトリ
printf("this is directry\n");
break;
}
// ファイルのサイズ
printf("file size : %d\n",fileStat.st_size);
// 最後にアクセスされた時刻
t = fileStat.st_atime;
printf("acsess time\t\t: %s",ctime(&t));
// 最後に修正された時刻
t = fileStat.st_mtime;
printf("modification time\t: %s",ctime(&t));
// 最後に属性変更された時刻
t = fileStat.st_ctime;
printf("status change time\t: %s",ctime(&t));
}
{
char c;
c = getchar();
}
return 0;
}
1.
2.
#include <io.h>
int access(const char *pathname, int mode)
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
#include stdio.h>
#include <io.h>
#define FILENAME "access.txt"
int main(void)
{
FILE *fp;
// とりあえず、ファイルを削除
printf("remove file\n");
if( remove(FILENAME) != 0 )
perror("remove");
// ファイル有無の確認
if( access(FILENAME,00) == 0)
{
printf(FILENAME" is exist\n");
}
else
{
perror("access1");
}
// ファイルを作成
printf("make file\n");
if( (fp = fopen(FILENAME,"w")) == NULL )
{
perror("fopen");
}
fclose(fp);
// ファイル有無の確認
if( access(FILENAME,00) == 0)
{
printf(FILENAME" is exist\n");
}
else
{
perror("access2");
}
{
char c;
c = getchar();
}
return 0;
}
main関数には2つの引数がある。int argcargv[]の添え字とargcの値は1つずれていることに注意argc=1、引数1つの場合はargc=2となる。char *argv[]argv[0]は自分自身のパスが入る。argv[1]から順に格納されている。argvはchar型ポインタのポインタなので、char *argv[] は char **argv と同じことになる。main関数の引数をほかの関数に渡すには次のようにすればいい。
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
#include <stdio.h>
void printArgv(int argc,char** argv)
{
int i;
for(i=0; i<argc; i++)
printf("%d\t%s\n", i, argv[i]);
}
int main(int argc, char *argv[])
{
printArgv(argc,argv);
{
char ss[80];
gets(ss);
}
return 0;
}