Как прочитать файл на C из подкаталога - PullRequest
0 голосов
/ 06 января 2012

Это сводит меня с ума. Я хочу читать из подкаталога (./method/CoyoteAdapter.java.tk.method.514.5.533.5.bk), но мой код падает на fscan (ошибка шины):

void readFrag( int **sequence, int& nTokens, char* fragName )
{
    FILE *file;
    char tmp[200];

    strncpy(tmp, &fragName[2], 198);

    char szWorkingDirectory[PATH_MAX];
    szWorkingDirectory[0] = '\0';
    getwd(szWorkingDirectory);

    printf("Attempting to open %s/%s\n", szWorkingDirectory, tmp);
    file = fopen(tmp, "r");

    nTokens = 0;
    fscanf(file, "%d", &(*sequence)[nTokens]);

    while(!feof (file))
    {
        fscanf(file, "%d", &(*sequence)[nTokens]);
        ++nTokens;
    }

    fclose(file);
}

// maxFragSizes: Each block has its max frag size
void init( int **seq, int& seqSize, int **sub, int& subSize, int **problemSizesPerBlock, char* fragListName )
{
    FILE *file;
    char line[200];

    int* tokens = new int[THREADS_PER_BLOCK-1]; 
    int nTokens = 0;

    file = fopen(fragListName, "rt");

    while(fgets(line, 200, file) != NULL)
    {
        readFrag( &(*seq), nTokens, line ); 
    }

    fclose(file);

}

Однако, если я скопирую файл в свой каталог, он будет работать. Я в UNIX (Mac OS). Пожалуйста помоги!

Редактировать: я добавил следующий код, как предложено. Вывод это нормально, но все равно не работает ...

Ответы [ 4 ]

2 голосов
/ 06 января 2012

AVD почти прав - вам нужно проверить FILE* из fopen(3), чтобы увидеть, действительно ли вы открыли файл.Но его ответ (и аналогичный ответ Селби ) оба пренебрегают самой важной частью информации: почему fopen(3) не удалось .

Попробуйте это:

void readFrag( char* fragName )
{
    FILE *file;
    int tmp;

    file = fopen(fragName, "r");
    if (!file) {
        perror("Error reading fragment file in readFrag");
        return;
    }
    fscanf(file, "%d", &tmp);
}

Я также удалил t из режима, поскольку нигде не могу найти документацию, поддерживающую его использование.Я надеюсь, что это не является причиной проблемы - можно было бы надеяться, что библиотеки будут более строгими - но поскольку это неверный ввод, он, безусловно, может быть виноват.(Проверьте справочную страницу fopen(3) вашей системы и , пожалуйста исправьте меня, если я ошибаюсь в вашей платформе.)

2 голосов
/ 06 января 2012

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

 file = fopen(fragName, "rt");
 if(file==NULL)
 {
    printf("\nFile not found");
    return 0;
  }
 fscanf(file, "%d", &tmp);
1 голос
/ 06 января 2012

Вы не проверяете, имеет ли значение «file», возвращаемое функцией fopen () значение NULL, или нет перед вызовом fscanf.Вот почему у вас происходит сбой.

Что касается того, как открыть файл, вы можете вызвать getcwd (getwd) и распечатать результат, чтобы увидеть, находитесь ли вы в родительском каталоге, в котором, как вы думаете, вы находитесь.Возможно, вам не нужен префикс "./" в вашем пути к файлу, но я не думаю, что это больно.

void readFrag( char* fragName ) 
{ 
    FILE *file; 
    int tmp; 
    char szWorkingDir[PATH_MAX];
    szWorkingDirectory[0] = '\0';
    getwd(szWorkingDirectory);

    printf("Attempting to open %s/%s\n", szWorkingDir, fragName);

    file = fopen(fragName, "rt"); 
    if (file != NULL)
        fscanf(file, "%d", &tmp); 
} 

int main()
{
    readFrag("method/CoyoteAdapter.java.tk.method.514.5.533.5.bk");
    return 0;
}
0 голосов
/ 06 января 2012

Скорее всего, значение seq, которое вы передаете своей функции инициализации, не указывает на указатель на допустимую память (либо seq само по себе недопустимо, либо *seq равно)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...