C – la escritura de la salida a un archivo

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

Supongo que esta es una pregunta relativamente simple 🙂

Básicamente el programa es mediante una permutación algoritmo, y la impresión de la salida a la salida estándar en la consola. También quiero escribir el contenido de un archivo a través de fprintf supongo. Aunque me parece que no puede conseguir trabajo. Simplemente imprime los caracteres de basura en la primera línea en el archivo de texto y nada más !

Me le pegue el código de abajo, y la ayuda se agradece mucho ! El escribir en el archivo de código se encuentra dentro de la función de impresión.

Gracias,

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;
}
  • Me gustaría sugerir una menor dependencia de macros para tareas que pueden ser fácilmente manejados a través de las funciones de lugar.
  • +1 @sarnold. Su futuro depuración de auto te lo agradecerá.
InformationsquelleAutor PnP | 2012-02-10

3 Kommentare

  1. 6

    1. Incorrecto modos de acceso en fopen llamada

    Abre tu archivo archivo binario: fopen("char-array.txt", "wb");. No ponga b a esta cadena que contiene modos de acceso si usted va a escribir con formato de cadenas. Y ya que usted probablemente desee anexar nuevos datos al final del archivo, en lugar de overwritting ellos, el uso de a en lugar de w:

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

    2. Escrito el buffer de salida, no directamente en el archivo

    Cuando usted está utilizando funciones como fprintf, no escribir directamente el archivo pero al búfer de salida. Usted tiene que usar fflush para escribir datos desde el búfer de salida en el archivo, o puedes simplemente cerrar el archivo mediante fclose función que vacía esta búfer de forma automática.

    Sólo tiene que añadir esta línea:

    fclose(fpIn);

    al final de print función.

    3. Formato incorrecto de la salida

    Usted no debe elenco int a char. Truncará sus números. Y usted también tiene fprintf(fpIn, "\n"); en mal ámbito supongo. Se podría parecer a esto:

    for (i = 0; i < size; i++) {
      printf("%d ", v[i]);
      fprintf(fpIn, "%d ", v[i]);
    }
    perm_count++;
    printf("\n");
    fprintf(fpIn, "\n");
    • También, dependiendo del sistema operativo, puede ser un problema de que el archivo se abre para los binarios escribir («wb»).
    • He hecho los cambios, pero todavía parecen estar recibiendo basura de salida ? Ver la edición 🙂
    • Tomada de la edición en cuenta, gracias 🙂 sin Embargo, el resultado en el bloc de notas es sólo aleatoria de caracteres ASCII.
    • Han corregido todos 3 los problemas que he señalado?
    • Sí 🙂 y muchas gracias de nuevo LihO
    • Eres bienvenido. Te agradecería si usted acepte esta respuesta.
    • @LihO. Por qué you don't write directly to the file but to the output buffer y cómo hacerlo? Gracias!
    • Digamos que en la mayoría de los casos el disco tiene mejores cosas que hacer que cuidar de cada fprintf llamada. De lo que se escribe en un archivo está realmente escrito a la vez que el buffer se vacía (por ejemplo, cuando el archivo está cerrado llamando fclose).
    • Lo siento, no he entendido sus palabras. Ahora entiendo, gracias!

  2. 1

    No pierdas el tiempo haciendo de programación que usted no tiene que, el uso de fprintf es bonito, pero ya que todo lo que quiero hacer es imprimir la salida, usted puede simplemente imprimir cosas en el archivo directamente a través de UNIX comandos integrados. Decir que su programa se llama wirteoutput entonces todo lo que tienes que hacer es pasar el siguiente comando cuando se llama desde el shell writeoutput > file.txt. Todo lo que tendría que utilizar sería el printf función.

    Si eres curioso acerca de esto, este es un viejo función y usted puede encontrar una descripción detallada en el documento original El Sistema Operativo UNIX. Mira en la sección llamada Estándar de I/O.

  3. 0

    No convierte a un char (a partir de un int) cuando se escribió para el archivo, como lo hizo con la presentación de la pantalla. El siguiente le proporcionará los mismos números en el archivo que estás viendo en pantalla:

    fprintf(fpIn, "%d", (char)v[i]);

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea