Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
读取一个文件并写入另一个C_C_Recursion_File Io - Fatal编程技术网

读取一个文件并写入另一个C

读取一个文件并写入另一个C,c,recursion,file-io,C,Recursion,File Io,我正在尝试从文件中读取数据并写入临时文件。然而,我现在陷入了一个无限循环。下面的函数被一个递归函数多次调用,该函数通过目录读取文件 我的方法是从一个文件中读取每个单词,然后将这些单词读到另一个文件中 如果我只是打印出每个单词,我的函数就可以很好地工作。它打印出所有目录中每个文件中的每个单词。然而,当我试图开始写入临时文件(代码被注释掉)时,我陷入了while循环 另一方面,如果我在一个测试程序中只调用一次函数,在这个程序中我只读取当前目录中的一个文件,然后写入一个临时文件,就可以了 这就是我所拥

我正在尝试从文件中读取数据并写入临时文件。然而,我现在陷入了一个无限循环。下面的函数被一个递归函数多次调用,该函数通过目录读取文件

我的方法是从一个文件中读取每个单词,然后将这些单词读到另一个文件中

如果我只是打印出每个单词,我的函数就可以很好地工作。它打印出所有目录中每个文件中的每个单词。然而,当我试图开始写入临时文件(代码被注释掉)时,我陷入了while循环

另一方面,如果我在一个测试程序中只调用一次函数,在这个程序中我只读取当前目录中的一个文件,然后写入一个临时文件,就可以了

这就是我所拥有的(
fileName
传入时实际上是绝对路径,我会
。/tmp
这样它就不会被递归函数捕获):


您的代码中没有任何内容表明存在无限循环。但是,如果
fileName
非常大,您可能会打开和关闭“.\tmp”数百万次。正如Joachim Pileborg在评论中指出的那样,您应该在函数开始时只打开该文件一次,然后在函数结束时再次关闭它


如果你想让自己相信你不是在一个无限循环中,那么在每次迭代中打印出
ch
的值。

好的,我这样做了,它成功了。但我不明白为什么。有人能解释一下吗

void fileReadWrite(char *pattern, char *before, char *replace, char *fileName) {
   FILE *file = fopen(fileName, "r");
   FILE *f = fopen("../tmp", "wb"); // MOVE HERE

   if (file != NULL) {
      int ch, word = 0;
      while ((ch = fgetc(file)) != EOF) {
         if (isspace(ch) || ispunct(ch)) {
            if (word) {
               word = 0;
               putchar('\n');
            }
         }
         else {
            word = 1;
            putchar(ch);

            /*

            if (f == NULL)
            {    
               printf("Error opening file!\n");       
               exit(1);
            }

            fprintf(f, "Some text"); // Or fprintf(f, ch);


            */
         }
      }
      fclose(file);
      fclose(f); // MOVE HERE
   }
}

你确定它卡在回路里了吗?您是否尝试过在调试器中逐行遍历代码,以确保显示的代码是问题所在?当您突然创建一个新文件时,可能是在目录中穿行的代码导致了问题?您应该真正了解如何使用调试器来帮助您解决这些问题。另外,为什么要以二进制模式打开临时文件?(它不会引起问题,但如果您正在向其写入文本,请以文本模式打开它。)如果你进入一个目录,然后写入../tmp,那么一旦你再次进入递归,你可能会再次读取../tmp文件。我在while循环之前和之后都放了一条print语句,它永远不会碰到第二条。我的递归函数只查看子目录,所以我认为它在那里很好。您发布的函数与递归无关。它接受您读写到另一个文件的文件名。如果这被卡住了,那么它是因为另一个原因卡住的,与递归无关。这是该功能的完整代码吗?或者它是一个最小的表示形式?只是猜测,但可能它(以前)没有挂起,但似乎是因为它运行非常缓慢,花费大量时间反复打开和关闭(输出)文件(几乎每个文件的每个字符都有一次)。此外,在输出第一个字符后,它可能看起来像是被卡住了,因为文件每次都被清空和覆盖(“a”会添加到文件的末尾…但“w”每次打开时都以一个空文件开头)。。。因此,输出文件的字符数永远不会超过1个(或“某些文本”)。
void fileReadWrite(char *pattern, char *before, char *replace, char *fileName) {
   FILE *file = fopen(fileName, "r");
   FILE *f = fopen("../tmp", "wb"); // MOVE HERE

   if (file != NULL) {
      int ch, word = 0;
      while ((ch = fgetc(file)) != EOF) {
         if (isspace(ch) || ispunct(ch)) {
            if (word) {
               word = 0;
               putchar('\n');
            }
         }
         else {
            word = 1;
            putchar(ch);

            /*

            if (f == NULL)
            {    
               printf("Error opening file!\n");       
               exit(1);
            }

            fprintf(f, "Some text"); // Or fprintf(f, ch);


            */
         }
      }
      fclose(file);
      fclose(f); // MOVE HERE
   }
}