C通过递归函数写入文件

时间:2018-09-10 05:34:48

标签: c io

我有一个程序(递归地)创建字母长度不同的组合,并希望将它们附加到文件中:

#include <stdio.h>
#include <stdlib.h>
void combinationUtil(char arr[], char data[], int start, int end, 
                     int index, int r);

void printCombination(char arr[], int n, int r)
{
    char data[r];
    combinationUtil(arr, data, 0, n-1, 0, r);
}

void combinationUtil(char arr[], char data[], int start, int end,
                     int index, int r)
{
    FILE *f = fopen("file.txt", "a");
    const char *eol = "\n";

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

    if (index == r)
    {
        for (int j=0; j<r; j++) 
        {
            fprintf(f, "%c", data[j]);
            printf("%c", data[j]);
        }
        fprintf(f, "%s", eol);
        printf("\n");
        fclose(f);
        return;
    }

    for (int i=start; i<=end && end-i+1 >= r-index; i++)
    {
        data[index] = arr[i];
        combinationUtil(arr, data, i+1, end, index+1, r);
    }
}

int main()
{
   char arr[] = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'};
   for (int r=1; r<=14; r++) 
   {
       int n = sizeof(arr)/sizeof(arr[0]);
       printCombination(arr, n, r);
   }
}

该程序符合要求,没有任何警告或错误。我希望将长度1到长度14的组合写到我的文件中(是​​的,我知道这将花费很长时间,并且会使生成的文件很大)。

尽管如此,程序还是会扼杀并打印出来: Error in opening file!表示指针已获得NULL值。为什么会发生这种情况,我该如何解决?

2 个答案:

答案 0 :(得分:2)

Windows为可以一次打开的文件数指定了一些限制:

  

C运行时库可在任何一次打开的文件数限制为512。 尝试打开超过文件描述符或文件流最大数量的文件会导致程序失败。使用_setmaxstdio更改此数字。

如果您使用的是Linux,则进程可以打开的文件数是有限制的(可以使用以下命令找到):

ulimit -n (n is the the maximum number of open file descriptors, most systems do not allow this value to be set)

root用户可以尝试更改每个进程和每个系统的最大打开文件数。
   echo noOfFilesIwantToOpen > /proc/sys/fs/file-max

答案 1 :(得分:0)

叹息...

#include <stdio.h>
#include <stdlib.h>
void combinationUtil(char arr[], char data[], int start, int end, 
                     int index, int r, FILE *f);

void printCombination(char arr[], int n, int r, FILE *f)
{
    char data[r];
    combinationUtil(arr, data, 0, n-1, 0, r, f);
}

void combinationUtil(char arr[], char data[], int start, int end,
                     int index, int r, FILE *f)
{
    const char *eol = "\n";

    if (index == r)
    {
        for (int j=0; j<r; j++) 
        {
            fprintf(f, "%c", data[j]);
            printf("%c", data[j]);
        }
        fprintf(f, "%s", eol);
        printf("\n");
        return;
    }

    for (int i=start; i<=end && end-i+1 >= r-index; i++)
    {
        data[index] = arr[i];
        combinationUtil(arr, data, i+1, end, index+1, r, f);
    }
}

int main()
{

   FILE *f = fopen("file.txt", "a");

   if (f == NULL)
   {
      printf("Error in opening file!\n");
      exit(1);
   }
   char arr[] = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'};
   for (int r=1; r<=14; r++) 
   {
       int n = sizeof(arr)/sizeof(arr[0]);
       printCombination(arr, n, r, f);
   }
   fclose(f);
}