2014-04-12 20 views
0

我在C中使用fopen(3)来读取文件并对其进行处理。我已经把当前工作目录下的文件放到了目录中,但是我无法读取该文件(Linux环境/ Cygwin环境)。C中的'fopen'无法在Unix上的当前directoy中打开现有文件

下面是示例代码:

的C代码:

在当前目录中设置为777
#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; 
} 

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

+1

你会得到什么错误?什么'perror'线输出? –

+0

我试过你的程序,它对我来说工作正常。 – riklund

+0

错误在打开文件... – cslrnr

回答

0

我应该问这个问题一点更复杂......

我有三个函数来处理同一个文件,像process_fil1e1(),process_file2()和process_file3(),即使我叫FCLOSE()在所有三个功能。不知何故文件句柄没有正确关闭,或文件指针指向EOF或某些未定义的行为。它工作不正常。

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

0

您已声明inFilefileName as global。你应该从

int process_file(FILE *inFile) 

改变你的函数原型

int process_file() 

这至少让你的程序更加清晰。现在关于您的问题:几乎可以肯定的是,您在输入文件中做了错误的输入文件(例如不输入文件扩展名)。请记住,您需要传递完整的文件名称(包括在Windows系统(默认情况下)会隐藏的扩展名)。否则,逻辑看起来对我来说是正确的,它应该工作正常。

+4

因为这两个变量都是全局变量,所以它并不重要。 –

+0

@JoachimPileborg:谢谢你指出。我第一次没有注意到。我已更新我的帖子。 –

0

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

如果您知道文件的扩展名,则只能输入名称,然后使程序添加扩展名。在scanf("%s", fileName);后添加strcat(fileName, ".txt");如果您只想输入没有扩展名的文件名,并且您读取的文件的扩展名为.txt

你的​​和fileName变量是外部的,所以你不需要有函数process_file();的参数,任何函数都可以访问这些变量。

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

+0

感谢您的建议,它是一个测试代码,问题是它只能在cygwin环境下工作,并且在linux,codeblocks ide,mysys – cslrnr