Pregunta

Estoy tratando de escribir algo de código que se abrirá un archivo, leer el contenido de su línea por línea y almacenar cada una de estas líneas en una matriz.

Primero abro el archivo y contar el número de líneas, cada una de las líneas es de una longitud fija por lo que simplemente hacer esto:

    char buf2[LINE_LENGTH];
    int in2 = open("toSend2", O_RDONLY);
    int number_of_lines = 0;

    for (;;)
 {
  char* p2 = buf2;
  int count = read (in2, p2, LINE_LENGTH);
  if (count < 0)
  {
    printf("ERROR");
    break;
  }
  if (count == 0) break; 

  number_of_lines++;

  printf("count: %d \n",count);
  printf("File 2 line : %s", p2);
  printf("\n");

 }
 close (in2);

Hasta el momento, esto funciona bien, NUMBER_OF_LINES es de hecho el número de líneas en el archivo "toSend2" y cada uno de mis printf son las líneas que contenga dicho fichero.

Ahora, con el número de líneas, se crea una matriz de cadenas y luego básicamente voy a través de todo el archivo de nuevo, pero esta vez, me gustaría para almacenar cada una de las líneas de la matriz (es probable que haya una mejor manera de encontrar el número de líneas en un archivo, pero todo lo que he intentado ha fallado!)

    char * array[number_of_lines];
    int b=0;
    int in3=0;
    in3 = open("toSend2", O_RDONLY);
    for (;;)
 {
  char* p3 = buf3;
  int count = read (in2, p3, LINE_LENGTH);
  if (count < 0)
  {
    printf("ERRORRRRRR");
    break;
  }
  if (count == 0) break;


  array[b] = p3;
  b++;

  printf("count: %d \n",count);
  printf("FILE 2 LINEEEEEE : %s", p3);
  printf("\n");

 }  
 close(in3);

Esto, por supuesto, no funciona: cada uno de mis printf son la línea derecha, más la última línea del archivo, por ejemplo, el primer printf sería:

ARCHIVO 2 LINEEEEEEE: "primera línea del archivo" "Última línea del archivo"

Y después de este bucle, cuando rastrear el contenido de mi matriz, cada elemento en él es simplemente la última línea del archivo. Creo que esto se debe a que sólo lleva el mismo puntero (que apunta a una línea diferente en ese momento) en la matriz cada vez, pero al final se apuntará a la última línea, por lo tanto, todo va a ser la última línea.

¿Cómo puedo resolver mi problema?

p.s .: Acabo de empezar C, así que por favor no asuma Sé que las cosas más básicas al respecto: (

¿Fue útil?

Solución

  • Uso stdio, es decir fopen(), fgets() y fclose() para hacer el I / O. Usted está utilizando de nivel inferior tanto al estilo POSIX I / O, sin una buena razón.
  • Usted tendrá que asignar dinámicamente cada nueva línea con el fin de almacenarla en la matriz. Puede utilizar strdup() para hacer esto.
  • Recuerde que las cosas pueden ir mal; archivos pueden dejar de abrir, las líneas pueden dejar de leer en, y la memoria pueden dejar de ser asignados. Comprobar esto, y actuar en consecuencia.

Otros consejos

No ha creado una matriz de cadenas, que ha creado un puntero a una matriz de cadenas. que necesita para malloc su matriz en parte2 ser conteo de líneas * número de línea por de carbón. a continuación, mover sus líneas de lectura en cada posición subsiguiente de matriz.

[editar]
una cosa más .....
sus cadenas son de longitud X. cuerdas 'C' son no la longitud X, son X + 1 :) longitud
[/ Editar]

¿por qué no usar fopen, a continuación, sólo tiene que utilizar fgets para obtener cada línea

Puede utilizar stat para obtener el tamaño del archivo. Entonces number_of_lines = stat.st_size/LINE_LENGTH

Si usted no necesita sus cadenas de caracteres-nul terminado, se puede leer el archivo completo en una sola memoria intermedia. Configurar la matriz de punteros si realmente los quiere, o simplemente utilizar &buf[n * LINE_LENGTH] para obtener el inicio de la línea n .

Para imprimir una cadena terminada no nulo de longitud conocida, se puede utilizar:

printf("line %d = '%.*s'\n", n, LINE_LENGTH, &buf[n * LINE_LENGTH]);

Déjame saber en un comentario si quieres ver código real.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top