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");. 如果您要在此处写入格式化字符串,请不要将其放入b包含访问模式的字符串中。并且由于您可能希望在文件末尾附加新数据而不是覆盖它们,请使用a而不是w

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,那么您所要做的就是在从 shell 调用它时传递以下命令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 回答