fopen()始终返回NULL

时间:2012-12-16 11:31:14

标签: c

int main()
{
    int i;
    FILE *list,*file;
    char temp[30];
    list=fopen("filelist","rb");
    while(fgets(temp,30,list)!=NULL)
    {
        file=fopen(temp,"r");
    {
    fclose(list);
    return 0;
}

这是我的代码我基本上想要打开文件列表中的所有文件但我的fopen调用(exept第一个总是返回NULL我错过了什么也是我的文件列表

file1
file2
file3
file4

我也不使用文件扩展名和文件存在于可执行文件的同一目录中。

3 个答案:

答案 0 :(得分:2)

fgets()将新行字符存储到正在填充的缓冲区中,因此您需要在fopen()内调用while之前将其删除。

来自fgets()的链接参考页:

  

最多读取计数 - 给定文件流中的1个字符并将它们存储在str中。生成的字符串始终以NULL结尾。如果文件结束发生或找到换行符,则解析停止,在这种情况下str将包含该换行符

删除换行符的示例代码:

char* nl = strrchr(temp, '\n');
if (nl)  *nl = 0;

答案 1 :(得分:1)

fgets将换行符留在字符串的末尾,您可以清楚地看到后续添加以下行:

printf ("[%s]\n", temp);

你会看到类似的东西:

[file1
]

您需要在使用前将其删除,您可以使用以下内容删除它:

size_t sz = strlen (temp);
if (sz > 0)
    if (temp[sz-1] == '\n')
        temp[sz-1] = '\0';

您可以在以下完整程序中看到此效果:

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

int main (void) {
    size_t sz;
    char temp[30];

    printf ("\n> ");
    while (fgets (temp, sizeof(temp), stdin) != NULL) {
        printf ("before: [%s]\n", temp);
        sz = strlen (temp);
        if (sz > 0) {
            if (temp[sz-1] == '\n') {
                temp[sz-1] = '\0';
            }
        }
        printf ("after : [%s]\n", temp);
        printf ("\n> ");
    }
    return 0;
}

它基本上使用您的确切方法来使用fgets(但是从标准输入)获取一行,然后在删除尾随换行符之前和之后输出结果。示例运行如下:

pax> ./testprog

> hello
before: [hello
]
after : [hello]

> goodbye
before: [goodbye
]
after : [goodbye]

> [CTRL-D]

pax> _

您可能还想查看该代码段中的其他一些内容:

  • {循环结束时使用左括号while
  • 你在循环中打开文件而不对它们做任何事情(包括关闭它们)。
  • 使用"rb"开放模式。通常这是不必要的,如果您知道它是文本文件,则肯定是不必要的。
  • 在使用之前,总是 检查可能失败的函数的返回码(如fopen)。
  • C中main的规范形式,其中不需要参数int main (void)

答案 2 :(得分:0)

我将陈述我的情况,我仍然不确定:我认为我的问题是“fopen”,但在尝试了每一个解决方案之后,我遇到了扩展问题,我在Windows 10中遇到了它。似乎Windows自动放置“.txt”但是,如果你把“.txt”作为扩展名,那么名称最后变为“.txt.txt”。所以我没有扩展名留下文件名,并将“file.txt”作为“fopen”的参数,这是它对我有用的唯一方式。