我正在嘗試解決遞回問題。問題是:給定一個數 n,列印出集合 {a, b, ..., a n-1} 的所有可能組合。在“output-n.txt”中輸出答案。1<=n<=9。
這是我的代碼:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
void comb(int n,int curlen,int j,int num[],int flag) {
int i,k;
char filename[20] = "output-0.txt";
filename[7] = n '0';
char ans[20] = { 0 };
FILE* fptr;
fptr = fopen(filename, "a");
if (fptr != NULL) {
if (curlen < n && flag != 0) {
for (i = 0; num[i] != 0; i ) {
ans[i] = num[i] '`';
}
for (k = 0; k <= curlen; k ) {
fprintf(fptr, "%c", ans[k]);
}
fprintf(fptr, " ");
if (curlen == 0 && num[0] == n) {
fclose(fptr);
}
else {
comb(n, curlen 1, j 1, num, 0);
}
}
else {
for (; j <= n; j ) {
num[curlen] = j;
comb(n, curlen, j, num, 1);
}
}
}
}
int main() {
int n,flag=0,num[20] = { 0 };
scanf("%d", &n);
comb(n, 0, 1, num, flag);
system("pause");
return 0;
}
我的程式在 1<=n<=7 時運行良好,但在 n=8 和 n=9 時,FILE 指標在中間變為 NULL,只能輸出部分答案。我仔細查看了輸出的 .txt 檔案,發現這兩個檔案都只能輸出到第 254 行。我想知道我是否犯了任何錯誤。謝謝回答。
uj5u.com熱心網友回復:
您已達到打開檔案數量的限制。
您不斷打開同一個檔案進行追加,而不是總是關閉它。當我重新排列代碼以使其在模式下打開檔案一次時,main它"w"可以正常作業。
#include <stdio.h>
#include <stdlib.h>
void comb(FILE *fptr, int n,int curlen, int j, int num[], int flag) {
int i,k;
char ans[20] = { 0 };
if (curlen < n && flag != 0) {
for (i = 0; num[i] != 0; i ) {
ans[i] = num[i] '`';
}
for (k = 0; k <= curlen; k ) {
fprintf(fptr, "%c", ans[k]);
}
fprintf(fptr, " ");
if (curlen == 0 && num[0] == n) {
//fclose(fptr);
}
else {
comb(fptr, n, curlen 1, j 1, num, 0);
}
}
else {
for (; j <= n; j ) {
num[curlen] = j;
comb(fptr, n, curlen, j, num, 1);
}
}
}
int main() {
int n,flag=0,num[20] = { 0 };
char filename[20] = "output-0.txt";
if(scanf("%d", &n) != 1 || n < 1 || n > 9) // sanity check
return 1;
filename[7] = n '0';
FILE *fptr = fopen(filename, "w"); // open once
if(fptr != NULL) {
comb(fptr, n, 0, 1, num, flag); // pass the file pointer
fclose(fptr);
}
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/532418.html
標籤:C递归文件-io组合
