0
EDIT: 

void print(const int *v, const int size) {
 FILE *fpIn;
 fpIn = fopen("char-array.txt", "a");
 int i;  
 if (v != 0) {
   for (i = 0; i < size; i++) {
     printf("%d", (int)v[i]);
     fprintf(fpIn, "%d\n", (int)v[i]);   
   }
   perm_count++;
   printf("\n");
 }
 fclose(fpIn);
} 

これは比較的簡単な質問だと思います:)

基本的に、プログラムは順列アルゴリズムを使用し、コンソールで出力を標準出力に出力します。また、私が想定しているfprintfを介してコンテンツをファイルに書き込みたいと思います。私はそれを動かすことができないようですが。テキストファイルの最初の行にガベージ文字を出力するだけで、それ以上は何も出力されません。

以下のコードを貼り付けます。助けていただければ幸いです。ファイルへの書き込みコードは、print関数内にあります。

ありがとう、

T。

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#include <time.h>

#include <time.h>
clock_t startm, stopm;
#define START if ( (startm = clock()) == -1) {printf("Error calling clock");exit(1);}
#define STOP if ( (stopm = clock()) == -1) {printf("Error calling clock");exit(1);}
#define PRINTTIME printf("%2.3f seconds used by the processor.", ((double)stopm-          startm)/CLOCKS_PER_SEC);

int perm_count = 0; 

void print(const int *v, const int size) {
  FILE *fpIn;
  fpIn = fopen("char-array.txt", "wb");
  int i;  
  if (v != 0) {
    for (i = 0; i < size; i++) {
      printf("%d", (char)v[i]);
      fprintf(fpIn, "%d", v[i]);  
      fprintf(fpIn, "\n");  
    }
    perm_count++;
    printf("\n");
  }
} 


void permute(int *v, const int start, const int n) {  
  int i;  
  if (start == n-1) {
    print(v, n);
  }
  else {
    for (i = start; i < n; i++) {
      int tmp = v[i];
      v[i] = v[start];
      v[start] = tmp;
      permute(v, start+1, n);
      v[start] = v[i];
      v[i] = tmp;
    }
  }
}

int main() {
 int i, x;
 printf("Please enter the number of terms: ");
 scanf("%d", &x);
 int arr[x];   
 printf("Please enter the terms: ");
 for(i = 0; i < x; i++)
 scanf("%d", &arr[i]);
 START
 permute(arr, 0, sizeof(arr)/sizeof(int));
 STOP   
 printf("Permutation Count: %d\n", perm_count);
 PRINTTIME
 return 0;
}
4

3 に答える 3

6

1. fopen呼び出しのアクセス モードが正しくない ファイルをバイナリ ファイル
として開きます。書式設定された文字列をそこに書き込む場合は、アクセス モードを含むこの文字列に配置しないでください。また、おそらく新しいデータを上書きするのではなく、ファイルの最後に追加したいので、代わりに次を使用します。fopen("char-array.txt", "wb");baw

fopen("char-array.txt", "a");

2. ファイルに直接書き込むのではなく、出力バッファに書き込むfprintf
などの 関数を使用する場合、ファイルに直接書き込むのではなく、出力バッファに書き込みます。fflushを使用して出力バッファーからファイルにデータを書き込むか、このバッファーを自動的にフラッシュするfclose関数を使用してファイルを閉じることができます。

次の行を追加するだけです:

fclose(fpIn);

関数の終わりにprint

3. 出力の形式が正しく
ない に キャストintしないでくださいchar。それはあなたの数字を切り捨てます。また、あなたfprintf(fpIn, "\n");は間違った範囲にいると思います。次のようになります。

for (i = 0; i < size; i++) {
  printf("%d ", v[i]);
  fprintf(fpIn, "%d ", v[i]);
}
perm_count++;
printf("\n");
fprintf(fpIn, "\n");
于 2012-02-10T23:21:20.763 に答える
1

必要のないプログラミングに時間を無駄にしないでください。 の使用fprintfは素晴らしいですが、出力を印刷するだけなので、UNIX 組み込みコマンドを使用してファイルに直接印刷することができます。プログラムが呼び出されwirteoutputた場合、シェルから呼び出すときに次のコマンドを渡すだけですwriteoutput > file.txt。使用する必要があるのはprintf関数だけです。

これについて興味がある場合は、これは古い関数であり、元の論文The UNIX Operating Systemで詳細な説明を見つけることができます。標準 I/O というセクションを見てください。

于 2012-02-10T23:43:50.293 に答える
0

画面表示で行ったように、ファイルに書き込むときにchar( a から) にキャストしませんでした。int以下は、画面に表示されているのと同じ番号をファイルに提供します。

fprintf(fpIn, "%d", (char)v[i]);
于 2012-02-10T23:34:08.003 に答える