2017-01-21 4 views
2

HAFTUNGSAUSSCHLUSS: Ich bin neu in CDatei zu dynamischen Arrays in c

Was ist der beste Weg, um jede Zeile in einer TXT-Datei zu konvertieren (kann auch andere Dateitypen sein) zu einem dinamic calloc() Array, und umgekehrt?

In meiner Datei muss ich folgendes:

1 Hello 
2 18 
3 World 
4 15 
etc... 

Ich möchte so etwas wie dies in der Anordnung:

[0] Hello 
[1] 18 
[2] World 
[3] 15 
etc... 

Der Code ich habe jetzt:

FILE *file; 
file = fopen("test.txt", "r"); 
int i = 0; 

//make dynamic calloc array 
//while line!= EOF 
    //put line[i] into array 
    //i++ 
    //realloc array, size +1 

fclose(file); 

dies ist Wie kann man das gut machen oder gibt es ein besseres? Wenn mir jemand mit dem Code ein bisschen helfen könnte, wäre ich wirklich dankbar.

+0

So wird jede Zeile der Datei mit einer Zahl beginnt. Was ist der Zweck dieser Nummer? Nur eine Zeilennummer? Müssen diese Nummern irgendwo gespeichert werden? – RoadRunner

Antwort

2

Sie befinden sich in der Nähe der richtigen Lösung, aber hier ordnen Sie das dynamische Array jedesmal neu zu, wenn eine neue Zeile vorhanden ist. Sie können N Byte im Voraus im Array zuweisen und jedes Mal erneut mit dieser Größe zuweisen diese häufige Speicher Bewegung des Array und sys Anrufs vermeiden:

FILE *file; 
file = fopen("test.txt", "r"); 
int i = 0; 

int max = 256; 
int resize = 512; 
char **arr = malloc(max * sizeof(*arr)); 


//make dynamic calloc array 
//while line!= EOF 
    //put line[i] into array 
    //i++ 

    if(i == max) 
     realloc array, size + reisze; 

fclose(file); 
0

i zuerst die Anzahl der Zeilen erhalten würde, und dann weist Speicher für ein Array zu realloc() -Aufruf zu vermeiden (möglicherweise ordnet einen neuen Speicherblock und kopiert den Speicherbereich). aber ich bin mir nicht sicher, dass dieser Weg effizienter ist. hier ist mein Beispielcode:

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

static int get_nlines(FILE* fp) 
{ 
    int nlines = 0; 

    int ch; 
    while (!feof(fp)) { 
     ch = fgetc(fp); 
     if (ch == '\n') { 
      nlines++; 
     } 
    } 

    fseek(fp, 0, SEEK_SET); 
    return nlines; 
} 

static char* get_value(char* s) 
{ 
    char* pch; 
    pch = strtok(s, " "); 
    if (pch != NULL) { 
     pch = strtok(NULL, " "); 
     if (pch != NULL) { 
      return strdup(pch); // need to free() after use 
     } else { 
      return NULL; 
     } 
    } else { 
     return NULL; 
    } 
} 

int main() 
{ 
    FILE* fp = fopen("test.txt", "r"); 
    if (fp != NULL) { 
     int nlines = get_nlines(fp); 

     printf("nlines: %d\n", nlines); 

     // make values.. 
     char** values = calloc(nlines + 1, sizeof(char*)); // +1 for a sentinel 
     if (values != NULL) { 
      char line[1024]; 
      int idx = 0; 
      while (fgets(line, sizeof(line), fp) != NULL) { 
       values[idx] = get_value(line); 
       idx++; 
      } 
     } 

     // use values.. 
     char** p = &values[0]; 
     while (*p != NULL) { 
      printf("%s\n", *p); 
      p++; 
     } 

     // clean values.. 
     p = &values[0]; 
     while (*p != NULL) { 
      free(*p); 
      p++; 
     } 

     fclose(fp); 
    } else { 
     perror("test.txt"); 
    } 
} 

das Ergebnis:

$ ./a.out 
nlines: 4 
Hello 

18 

World 

15 
Verwandte Themen