C の Linux プログラムを DOS に変換しようとしています。DOS コマンド ラインでは 128 バイトしか使用できないため、ファイルから引数を読み取ろうとしました。このファイルには、引数ごとに 1 行あります。
そのため、ファイルから引数を文字列配列に読み込み、*argv[] アドレスを文字列配列のアドレスでオーバーライドしたいと考えています。
しかし、ポインターへのポインターと混同されます。関数で *argv[] アドレスを正しくオーバーライドするにはどうすればよいですか?
このプログラムは「argvtest.exe commands.dat」で呼び出されます
ここに私のテストコードがあります:
#include <stdio.h>
#include <string.h>
void read_cmd_file(int *argc,char *argv[]){
if (*argc != 2 ) return;
char buf[256];
char arguments[30][256];
int line_nr=0,i;
FILE *fp=(FILE *) NULL;
/* open the file */
fp=fopen(argv[1],"r");
if (fp == (FILE *) NULL)
{
printf("Could not open command file: %s",argv[1]);
return;
}
while (fgets(buf,sizeof(buf)-1,fp) && !feof(fp))
{
line_nr++;
strcpy(arguments[line_nr],buf);
//printf("Argument read: %s\n",buf);
}
if (fp != (FILE *) NULL)
(void) fclose(fp);
for (i=1;i<=line_nr;i++) printf("%d,%s\n",i,arguments[i]);
*argv=&arguments[0][0];
*argc=line_nr;
return;
}
int main(int argc,char **argv)
{
int i;
read_cmd_file(&argc,argv);
printf("argc=%d\n",argc);
for (i=0;i<argc;i++) printf("%d,%s\n",i,argv[i]);
}