Файловому указателю не назначается значение при использовании fopen () - PullRequest
0 голосов
/ 10 января 2020

Я пытаюсь написать простую C программу, которая будет считывать данные из файла CSV и выполнять некоторые вычисления на этих данных.

К сожалению, у меня проблема с указателем моего файла, fptr, после вызова fopen() не присваивается значение. Я знаю, что это тот случай, когда я прошел отладчик VS 2017 года. И все же я не знаю, почему это так. Это огромная проблема и означает, что моя программа будет выдавать некоторые очень неприятные исключения каждый раз, когда я пытаюсь прочитать данные из файла или закрыть файл.

Мой код ниже:

main. c

#include<stdio.h>
#include <stdlib.h>         // For exit() function
#include"constants.h"       //For access to all project constants

/***************************************************************************************************************
To keep the terminal from automatically closing
Only useful for debugging/testing purposes
***************************************************************************************************************/
void preventTerminalClosure() {
    //flushes the standard input 
    //(clears the input buffer) 
    while ((getchar()) != '\n');
    printf("\n\nPress the ENTER key to close the terminal...\n");
    getchar();
}

/***************************************************************************************************************
Read the given input file
***************************************************************************************************************/
void readInputFile(char fileName[]) {
    FILE *fptr;
    char output[255];

    //open the file
    if (fptr = fopen(fileName, "r") != NULL) {          //read file if file exists
        //fscanf(fptr, "%[^\n]", output);
        //printf("Data from the file:\n%s", output);
        printf("<--Here-->");
    }else {                             
        printf("\nERROR 1: File %s not found\n", fileName);
        preventTerminalClosure();
        exit(1);
    }

    fclose(fptr);                       //close the file
}

/***************************************************************************************************************
                                        *   *   *   Main    *   *   *
***************************************************************************************************************/
void main() {
    char testName[MAX_NAME_SIZE];

    printf("Hello World!\n");
    printf("Please enter your name: ");
    scanf("%s", testName);

    printf("It's nice to meet you %s!", testName);

    readInputFile("dummy.txt");

    preventTerminalClosure();   //Debug only

}

Я убедился, что мой фальшивый файл действительно существует и находится в правильном месте. В противном случае мой код попадет в блок else внутри readInputFile(). Это то, что я тщательно проверил.

Я явно упускаю кое-что из базового c, которое объясняет поведение указателя; но что это такое, я не уверен. Любая помощь будет оценена! :)

1 Ответ

1 голос
/ 10 января 2020

Используйте скобки для обеспечения порядка, чтобы fptr сравнивалось с NULL после того, как ему было присвоено значение, возвращаемое fopen:

FILE *fptr;
char output[255];

//open the file
if ( (fptr = fopen(fileName, "r")) != NULL)
...