0
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 调用(除了第一个总是返回 NULL 我错过了什么也是我的文件列表

file1
file2
file3
file4

我也不使用文件扩展名,并且文件存在于与可执行文件相同的目录中。

4

3 回答 3

2

fgets()将换行符存储到它正在填充的缓冲区中,因此您需要fopen()while.

从链接的参考页面fgets()

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

删除换行符的示例代码:

char* nl = strrchr(temp, '\n');
if (nl)  *nl = 0;
于 2012-12-16T11:34:24.013 回答
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
  • mainC 中不需要参数的规范形式是int main (void).
于 2012-12-16T11:34:43.410 回答
0

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

于 2017-02-26T22:20:50.117 回答