Не удается открыть существующий файл, помещенный в рабочий каталог, с помощью c fopen()

Я работаю над программным обеспечением для обработки GPS, основанным на библиотеке с открытым исходным кодом. Эта библиотека предоставляет мне средство чтения файлов RINEX, которое открывает существующие файлы, содержащие навигационные сообщения GPS или данные наблюдений, а также множество функций обработки данных. Содержимое упомянутых выше файлов данных GPS используется для заполнения элементов структуры, которые используются алгоритмами, выполняющими обработку данных.

Моя проблема заключается в том, что функция чтения RINEX правильно считывает файлы, содержащие данные наблюдений (тип файла: yyO, где yy — две крайние правые цифры года наблюдения), но не может открыть ни один файл навигационного сообщения, который я дал в качестве входных данных (файл тип: yyN).

После сеанса отладки я понял, что функция чтения возвращает NULL указатель файла для этого типа файлов. Странно то, что эти файлы существуют в рабочем каталоге программы и не повреждены.

Ниже я привожу соответствующие блоки code:

Мой основной код вызывающего абонента:

int main(){
int stat; //Identifier of RINEX file status.

//Memory allocation for a "stat_t" variable (initialization of its members will be done when the program flow passes into the "rinex.c" file functions):
sta_t *st = (sta_t *) malloc(sizeof(sta_t));
//Get current working directory (for debugging):
char directory[_MAX_PATH];
_getcwd(directory, sizeof(directory));
printf("Current working directory: %s \n", directory);
//Initialize options structure members:
init_opt_members();
//Initialize processing options structure members:
init_prcopt_members();
//Initialization of observation data structure members (NULL: obs data not available):
init_obs_members();
//Initialization of navigation data structure members (NULL: nav data not available):
init_nav_members();
//Initialization of solution parameters data structure members (NULL: ...):
init_sol_members();

//Read configuration file and update the values of processing options struct:
loadopts("prcopt.txt", opt);
getsysopts(op, NULL, NULL);

//Read RINEX nav file:
stat = readrnx("IOAN.12N", 1, NULL, na, st); //ob = NULL
printf("Reader status = %d \n", stat);

//Read RINEX obs file:
stat = readrnx("IOAN.12O", 1, ob, NULL, st); //na = NULL, st members values will be updated by obs file header data.
printf("Reader status = %d \n", stat);

//Call the single-point positioning function:
stat = pntpos(ob->data, ob->n, na, op, so, NULL, NULL, "Error!");
printf("Single point pos status = %d \n", stat);

system("PAUSE");
return 0;
}

где функция readrnx() (предоставляемая библиотекой):

extern int readrnx(const char *file, int rcv, obs_t *obs, nav_t *nav, sta_t *sta)
{
gtime_t t={0};

trace(3,"readrnx : file=%s rcv=%d\n",file,rcv);

return readrnxt(file,rcv,t,t,0.0,obs,nav,sta);
}

readrnxt() в какой-то момент вызывает функцию распаковки и открытия файла readrnxfile(). который (немного измененный из реализации стандартной библиотеки):

static int readrnxfile(const char *file, gtime_t ts, gtime_t te, double tint,
                   int flag, int index, char *type, obs_t *obs, nav_t *nav,
                   sta_t *sta)
{
FILE *fp = NULL;
int cstat,stat;
char tmpfile[1024];

trace(3,"readrnxfile: file=%s flag=%d index=%d\n",file,flag,index);

if (sta) init_sta(sta);

/* uncompress file */
/*if ((cstat=uncompress(file,tmpfile))<0) {
    trace(2,"rinex file uncompact error: %s\n",file);
    return 0;
}*/
/*if (!(fp=fopen(cstat?tmpfile:file,"r"))) {
    trace(2,"rinex file open error: %s\n",cstat?tmpfile:file);
    return 0;
}*/
//It can't open nav files!
if (!(fp=fopen(file,"r"))) {
    trace(2,"rinex file open error: %s\n",file);
    printf("opening file failed: %s\n", strerror(errno)); //For debugging.
    return 0;
}
/* read rinex file */
stat=readrnxfp(fp,ts,te,tint,flag,index,type,obs,nav,sta);

fclose(fp);

/* delete temporary file */
//if (cstat) remove(tmpfile);

return stat;
}

Напечатав errno, я обнаружил указанную выше ошибку открытия файла, которая возникает только тогда, когда вышеуказанная функция пытается открыть файл навигационного сообщения.

Изменить: забыл сказать, что я проверил права доступа к файлам (я использую Windows 7) и использую Microsoft Visual Studio 2008 Professional.


person Kapoios    schedule 11.07.2012    source источник
comment
@Rohan: при печати errno я получаю сообщение об ошибке: открытие файла не удалось. Нет такого файла или каталога. Путем дальнейшей отладки я понял, что fopen() (см. тело readrnxt() в моем вопросе) возвращает указатель NULL всякий раз, когда он пытается открыть файл навигационного сообщения (только для файлов этого типа, это нормально с файлами другого типа).   -  person Kapoios    schedule 11.07.2012


Ответы (1)


Вы можете попробовать распечатать полное имя файла и проверить, доступно ли оно. Кроме того, вам может понадобиться проверить, можно ли открыть файл. Он открывается чем-то другим?

person Rango    schedule 11.07.2012
comment
Я уже проверил, есть ли он в наличии. Кроме того, как вы можете видеть, я использую функцию getcwd(), чтобы увидеть текущий рабочий каталог и проверить, помещен ли в него файл. Наконец, я могу открыть файл с помощью блокнота Windows и просмотреть его данные. - person Kapoios; 11.07.2012
comment
@Kapoios, я имею в виду, ты можешь открыть его во время работы приложения? - person Rango; 11.07.2012
comment
Сегодня я проверил свой код с другим файлом навигационных сообщений, и он работал правильно. Я могу проверить, является ли это шаблоном неправильного синтаксиса файла RINEX или просто странным поведением... - person Kapoios; 12.07.2012