Запись c в файл через рекурсивную функцию

У меня есть программа, которая (рекурсивно) создает комбинации различной длины из букв алфавита и хочет добавить их в файл:

#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. Почему это происходит и как это исправить?

Почему вы открываете один и тот же файл снова и снова? Откройте его один раз и протяните ручку.

tkausl 10.09.2018 07:36

1) Вы делаете много рекурсивных вызовов. Это может вызвать проблемы со стеком (например, переполнение). 2) Вы открываете файл при каждом рекурсивном вызове. Возможно, вы столкнулись с каким-то системным ограничением количества открытых файлов.

4386427 10.09.2018 07:38

На самом деле это было чертовски очевидно ....

R. Rengold 10.09.2018 07:40
0
3
140
2

Ответы 2

Вздох...

#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);
}

Окна определяет некоторые ограничения на количество файлов, которые могут быть открыты одновременно:

The C run-time libraries have a 512 limit for the number of files that can be open at any one time. Attempting to open more than the maximum number of file descriptors or file streams causes program failure. Use _setmaxstdio to change this number.

И если вы используете 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

@user: Я ответил на ваш вопрос.

P.W 11.09.2018 06:53

Другие вопросы по теме