1

ファイルから配列にデータを渡すプログラムを書いていますが、fopen()で問題が発生しています。ファイルパスをパラメータ(例)にハードコーディングすると正常に機能するようですfopen ("data/1.dat", "r");が、ポインタとして渡すとNULLが返されます。

コマンドラインから入力すると、142行目で「data / 1.dat」が出力されるため、parse_args()が機能しているように見えることに注意してください。

132 int
133 main(int argc, char **argv)
134 {
135   FILE *in_file;
136   int *nextItem = (int *) malloc (sizeof (int));
137   set_t *dictionary;
138
139   /* Parse Arguments */
140   clo_t *iopts = parse_args(argc, argv);
141
142   printf ("INPUT FILE: %s.\n", iopts->input_file); /* This prints correct path */
143   /* Initialise dictionary */
144     dictionary = set_create (SET_INITAL_SIZE);
145
146   /* Use fscanf to read all data values into new set_t */
147   if ((in_file = fopen (iopts->input_file, "r")) == NULL)
148   {
149     printf ("File not found...\n");
150     return 0;
151   }

ありがとう!リス

詳細:set_create()(ln 144)を実行した後に文字列を印刷しようとすると、文字列が印刷されません。(しかし、関数内の文字列への参照はまったくありません...)

 47 set_t *
 48 set_create(int size)
 49 {
 50   set_t *set;
 51
 52   /* set set_t members */
 53   set->items = 0;
 54   set->n_max = size;
 55   set->lock = FALSE;
 56
 57   /* allocate memory for dictionary input */
 58   set->data = (int *) malloc (size * sizeof (int));
 59
 60   return set;
 61 }

fopen()の後にこの関数を呼び出すと機能します。これがファイル名にどのように影響しているかはわかりませんが...

再度、感謝します。

4

3 に答える 3

4

新しいコードは、無効なメモリに書き込んでいることを示しています。 setはポインタですが、初期化することはありません。ランダムなメモリを上書きしているため、渡す文字列へのポインターが破棄されますfopen()

于 2010-03-19T03:22:54.460 に答える
2

parse_args正しく動作しますか?たとえば、ローカル変数へのポインタ(またはそのようなポインタを含む構造体)を返す場合、のような値iopts->input_fileは後続の関数呼び出しによって簡単に破棄されます。

于 2010-03-19T03:01:17.063 に答える
2

その2番目の部分はあなたの問題です。セットは初期化されていません。

明確にするために:あなたはあなたが意図していないものを変更しているので、fopen()が失敗します。

于 2010-03-19T03:20:24.013 に答える