2014-01-26 28 views
-1

编辑:我在一个严格的C语言环境中。任何C++代码都不行。我处于无法调试的环境中。我只是能够编译和删除所有错误的程序。对不起,如果我看起来很严格,那只是我在这样的环境下工作。任何帮助感谢!将字符串指针传递给fopen时出错

我有一个叫做namefi.txt的文件,它的所有文件名都是一行一行。每行只有一个文件名,所以我使用strtok删除所有空格,并将文件名传给FOPEN。但似乎f-open并没有采取。它创建output.txt文件,甚至将其重命名为所需的名称(尽管直到name_ne.txt - 不知道为什么'w'丢失,'name'只有四个字符长,但仍然很好),但是当我打开文件,我看到的只是“文件打开错误Naren.txt”。如果我注释掉程序的名称部分和重命名部分,它会从输入文件写出输出文件。这只是它从namefi.txt获取文件名并打开它的部分没有发生。任何帮助,将不胜感激。这是我的代码。

#include<stdio.h> 
#include<string.h> 
#include<stdlib.h> 
void main() 
{ 
    FILE *inpfi, *outfi, *namefi,newna; 
    char buf[132], name[132], *trim; 
    namefi = fopen("Namefi.txt", "r"); 
    while(frets(name, 132, namefi)!=NULL) 
    { 
     trim = strtok(name," "); 
     inpfi = fopen(trim, "r"); 
     outfi = fopen("OUTPUT.txt", "w"); 
     if(!inpfi) 
      fprintf(outfi, "File open error: %s", trim); 
     while(fgets(but,132,inpfi)!=NULL) 
      fprint(outfi, "%s", buf); 
     newna = strtok(trim, "."); 
     newna = strcat(newna,"_new.txt"); 
     rename("OUTPUT.TXT", newna); 
     fclose(inpfi); 
     fclose(outfi); 
    } 
} 
+2

编译所有警告和调试信息(可能用'gcc -Wall -g')。 **使用调试器**(如'gdb')。测试所有对libc函数的调用(例如'fopen')。使用'perror'来显示错误代码。告诉我们您的编译器,操作系统,文件系统....'frets'应该是'fgets';还请缩进您的代码以使其更具可读性。 –

+0

@BasileStarynkevitch感谢您的评论。我编辑了这个问题。关于缩进,我确实给了ctrl + k。不知道为什么它不起作用。 :(对不起。 –

+0

只需输入适当数量的空格来缩进代码。在Linux系统上,您还可以使用:'indent source.c';然后'sed's/^//'source.c' - 这里有在第二个和第三个'/'之间有四个空格 - 并复制粘贴'sed'命令的输出.... –

回答

1
  1. FILE *inpfi, *outfi, *namefi,newna; 
    

    newna缺少*

  2. while(frets(name, 132, namefi)!=NULL) 
    

    frets应该fgets

  3. trim = strtok(name," "); 
    inpfi = fopen(trim, "r"); 
    

    你在太空中第一次出现启动文件名,我怀疑这意。

  4. outfi = fopen("OUTPUT.txt", "w"); 
    

    在每次循环迭代中覆盖OUTPUT.txt。您可能想要使用"a"而不是"w"或在循环输入前打开文件。

  5. while(fgets(but,132,inpfi)!=NULL) 
    

    but应该buf

  6. fprint(outfi, "%s", buf); 
    

    fprint应该fprintf

  7. newna = strtok(trim, "."); 
    

    为什么你现在使用newnachar*,当你宣布它作为FILE(或FILE*,我想这应该是)

  8. rename("OUTPUT.TXT", newna); 
    fclose(inpfi); 
    fclose(outfi); 
    

    关闭它之前,重命名文件。我不完全知道这种情况下的行为,但我怀疑这是一个好主意。

我提到的大多数错误都可以通过校对,编辑器检查或编译器警告/错误轻易避免。你发布的代码当然不能编译。

+0

对不起,我从前一个文件中发布了一个错误,我发现了错误,这是因为我留在namefi文件中的空间。作为分隔符,我将空格改为“”,其中'。'作为分隔符,它起作用,你提到的这些错误已被纠正,但是非常感谢@nabla。 –

相关问题