C - запись вывода в файл

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, я полагаю. Хотя я не могу заставить его работать. Он просто печатает символы мусора в первой строке текстового файла и ничего более!

Я вставлю код ниже, и помощь очень ценится! Код для записи в файл находится в функции печати.

Спасибо,

Т.

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

3 ответа

Решение

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");

Не тратьте свое время на программирование, которое вам не нужно, использование fprintf это хорошо, но так как все, что вы хотите сделать, это напечатать вывод, вы можете просто напечатать вещи в файл напрямую, используя встроенные команды UNIX. Скажи, что твоя программа называется wirteoutput тогда все, что вам нужно сделать, это передать следующую команду при вызове из оболочки writeoutput > file.txt, Все, что вам нужно будет использовать, будет printf функция.

Если вам интересно это, это старая функция, и вы можете найти подробное описание в оригинальной статье "Операционная система UNIX". Посмотрите на раздел под названием Standard I/O.

Вы не бросили на char (из int), когда вы записали в файл, как вы сделали с отображением на экране. Ниже приведены те же цифры в файле, что вы видите на экране:

fprintf(fpIn, "%d", (char)v[i]);
Другие вопросы по тегам