fopen没有打开文件

时间:2015-02-19 01:45:09

标签: c string stdin fopen

我很确定这是打开文件的方式:

int readFile(char *filename){
char *source = NULL;
int fileSize;
char nameFile[strlen(filename)];
strcpy(nameFile,filename);
puts(nameFile);//Check if the string is correct
FILE *fp;

if ((fp =fopen(nameFile, "r")) != NULL) {
    /* Go to the end of the file. */
    if (fseek(fp, 0L, SEEK_END) == 0) {
        /* Get the size of the file. */
        long bufsize = ftell(fp);
        if (bufsize == -1) { /* Error */ }

        /* Allocate our buffer to that size. */
        source = malloc(sizeof(char) * (bufsize + 1));
        fileSize = (sizeof(char) * (bufsize + 1));

        /* Go back to the start of the file. */
        if (fseek(fp, 0L, SEEK_SET) != 0) { /* Error */ }

        /* Read the entire file into memory. */
        size_t newLen = fread(source, sizeof(char), bufsize, fp);
        if (newLen == 0) {
            fputs("Error reading file", stderr);
        } else {
            source[++newLen] = '\0'; /* Just to be safe. */
        }
    }
    fclose(fp);
} else{
    printf("File Doesnt Exist. :( \n");
    return 0;
}

所以,我在我的工作目录中。编译时,会在文件所在的位置创建可执行文件。我做了一个put来比较文件的名称。文件名(关于终端中显示的内容是相同的); 我切换了" r"到" r +"我仍然没有到我的文件不存在。 此外,我做了fopen(" actualFileName.txt")它确实有效......所以......任何想法?

这就是我所说的readFile:

fgets(userInput,sizeof(userInput),stdin);
readFile(userInput);

2 个答案:

答案 0 :(得分:0)

这是错误的

char nameFile[strlen(filename)];

应该是

char nameFile[1 + strlen(filename)];

因为strlen()没有包含终止nul字节,但您的代码仍然非常危险,因为filename可能是NULL,因为您永远不会检查,然后在调用strlen()时会发生未定义的行为。

source[++newLen] = '\0'; /* Just to be safe. */

证明您知道字符串最后需要'\0'

所以你分配的内存少于所需的内存,因此根据定义分配了BTW sizeof(char) == 1

当您尝试通过输出检查文件名时,请执行此操作

printf("*%s*\n", nameFile);

如果输出是这样的话,例如

*this_is_the_filename.txt
*

这意味着'\n'读取fgets()仍在缓冲区中,因此您需要将其删除,使用fgets()时可以执行此操作

size_t length;

fgets(userInput, sizeof(userInput), stdin);

length = strlen(userInput);
if (userInput[userInput - 1] == '\n')
    userInput[userInput - 1] = '\0';

避免在字符串末尾加'\n'

答案 1 :(得分:0)

一个问题:

char nameFile[strlen(filename)];

应该是:

char nameFile[strlen(filename) + 1];

另一个潜在问题:

fgets(userInput,sizeof(userInput),stdin);

在userInput的末尾嵌入任何行终止(例如,在* nix上为“\ n”,在Windows上为“\ r \ n”)。这可能是您无法打开文件的原因。尝试:

if (NULL == fgets(userInput,sizeof(userInput),stdin)) { /* handle error */ }
for (i = strlen(userInput); i > 0 && isspace(userInput[i]); --i);
userInput[i] = '\0';
readFile(userInput);

此外,您可能会获得有关fopen失败原因的更多信息:

perror("File Doesnt Exist. :( \n");