'#的fopen 39;在C中无法在Unix上的当前目录中打开现有文件

时间:2014-04-12 13:46:35

标签: c linux unix fopen

我在C中使用fopen(3)来读取文件并对其进行处理。我已将我尝试读取的文件放在当前工作目录中,但我无法读取该文件(Linux环境/ Cygwin环境)。

以下是示例代码:

C代码:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

FILE *inFile;
static char fileName[255];

int process_file(FILE *inFile)
{
    char ch;
    inFile = fopen(fileName,"r");
    if (inFile == NULL)
    {
        perror(fileName);
        exit(1);
    }
    else
    {
       // Process file
    }
    fclose(inFile);
    return 0;
}

int main(int argc, char *argv[])
{
    printf("Enter filename to process \n");
    scanf("%s", fileName);
    process_file(inFile);
    getchar();
    return 0;
}

我在当前目录中将文件权限设置为777。生成的二进制文件以及我的源代码驻留在输入文件退出的目录中。为什么文件没有打开?

3 个答案:

答案 0 :(得分:0)

您已将 inFile fileName 声明为全局。你应该从

改变你的函数原型
int process_file(FILE *inFile)

int process_file()

这至少会使您的计划更加清晰。现在关于你的问题:几乎可以肯定的是你在输入文件中输入错误(比如没有放入文件扩展名)。请记住,您需要传递完整的文件名(包括某些系统(如Windows)(默认情况下)将被隐藏的扩展名)。否则,逻辑对我来说是正确的,它应该可以正常工作。

答案 1 :(得分:0)

请务必输入文件名及其扩展名。这可能会导致读取文件时出现问题。

如果您知道文件的扩展名,则只能输入名称,然后在程序中添加扩展名。在scanf("%s", fileName);添加strcat(fileName, ".txt");后,如果您只想输入不带扩展名的名称,而您所阅读的文件的扩展名为.txt

您的inFilefileName变量是extern,因此您不需要为函数process_file();提供参数,任何函数都可以访问这些变量。

您可以将功能int process_file();更改为void process_file();并删除return 0,但您不需要。

答案 2 :(得分:0)

我应该再问一下这个问题......

我有三个函数来处理同一个文件,比如process_fil1e1(),process_file2()和process_file3(),即使我在所有三个函数中都调用了fclose()。某种程度上文件句柄未正确关闭或文件指针指向EOF或某些未定义的行为。它运作不正常。

当我使用单个进程文件并一起回放()时,它工作正常......