2012-12-16 93 views
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的调用(exept第一个总是返回NULL我失去的东西也这是我的文件清单fopen()函数总是返回NULL

file1 
file2 
file3 
file4 

也是我不使用文件扩展名,并在同一目录下的可执行wtih存在的文件。

回答

2

fgets()存储新行字符到它被填充,所以你需要将其删除缓冲区中的内调用fopen()前。

从链接参考页fgets()

读取最多次数 - 来自海峡指定的文件流,并将它们存储1个字符。生成的字符串始终以NULL结尾。如果发生文件结束,或者发现换行符,则分析停止,在这种情况下,str将包含该换行符

示例代码删除换行符:

char* nl = strrchr(temp, '\n'); 
if (nl) *nl = 0; 
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)
+1

也可能要查找'\ r'。 – mah

+0

我认为\ r通过编译器为文本文件 – user1180619

+0

@mah获取擦除,如果您混合使用文件格式(如DOS和UNIX),这只会成为一个问题,如果您在所有工作上做同样的事情类型。 – paxdiablo

0

我会说明我的情况,我仍然不确定:我认为我的问题是“fopen”,但在尝试每一个解决方案后,我遇到了扩展问题,我在Windows 10.看起来,Windows会自动放入“.txt”,但如果将“.txt”作为扩展名,则名称最后会变为“.txt.txt”。所以我留下了没有扩展名的文件名,并将“file.txt”作为“fopen”的参数,这是它为我工作的唯一方式。