我有一个程序(递归地)创建字母长度不同的组合,并希望将它们附加到文件中:
#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
值。为什么会发生这种情况,我该如何解决?
答案 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);
}