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
我也不使用文件扩展名和文件存在于可执行文件的同一目录中。
答案 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
)。main
的规范形式,其中不需要参数int main (void)
。答案 2 :(得分:0)
我将陈述我的情况,我仍然不确定:我认为我的问题是“fopen”,但在尝试了每一个解决方案之后,我遇到了扩展问题,我在Windows 10中遇到了它。似乎Windows自动放置“.txt”但是,如果你把“.txt”作为扩展名,那么名称最后变为“.txt.txt”。所以我没有扩展名留下文件名,并将“file.txt”作为“fopen”的参数,这是它对我有用的唯一方式。