Передача char * в fopen с помощью C - PullRequest
1 голос
/ 19 марта 2010

Я пишу программу, которая передает данные из файла в массив, но у меня проблемы с 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 (). Я не вижу, как это влияет на имя файла, хотя ...

Еще раз спасибо.

Ответы [ 3 ]

4 голосов
/ 19 марта 2010

Ваш новый код показывает, что вы пишете в недействительную память. set - указатель, но вы никогда не инициализируете его. Вы перезаписываете некоторую случайную память и тем самым уничтожаете указатель на строку, которую вы передаете fopen().

2 голосов
/ 19 марта 2010

Эта вторая часть - ваша проблема. набор не инициализирован.

Чтобы уточнить: вы модифицируете то, что не хотите, вызывая ошибку fopen ().

2 голосов
/ 19 марта 2010

Вы уверены, что parse_args работает правильно? Если, например, он возвращает указатель на локальную переменную (или структуру, содержащую такие указатели), значения типа iopts->input_file будут легко уничтожены последующими вызовами функций.

...