Wenn Sie jede Zeile der Datei als eine Zeile in dem Array zu speichern, verwenden Sie einen 2D-Array von char
:
char fileContents[NUM_LINES][LINE_LENGTH + 1]; // +1 for zero terminator
Wenn Sie nicht wissen, wie viele Zeilen, die Sie haben, dich vorne Ich brauche etwas Speicherverwaltung.Zuerst müssen Sie einen ersten Umfang zuzuordnen:
#define INITIAL_EXTENT 20 // or some good starting point
char (*fileContents)[LINE_LENGTH + 1] = malloc(sizeof *fileContents * INITIAL_EXTENT);
if (!fileContents)
{
// malloc failed; fatal error
fprintf(stderr, "FATAL: could not allocate memory for array\n");
exit(EXIT_FAILURE);
}
size_t numRows = INITIAL_EXTENT; // number of rows in array
size_t rowsRead = 0; // number of rows containing data
Wie Sie aus der Datei lesen, werden Sie überprüfen, um sicherzustellen, dass Sie Zimmer im Array; Wenn Sie dies nicht tun, müssen Sie das Array mit einem realloc
Aufruf erweitern, was eine potenziell teure Operation ist. Eine übliche Technik besteht darin, die Größe des Arrays bei jeder Erweiterung zu verdoppeln - das minimiert die Gesamtzahl der Aufrufe realloc
. Das Risiko ist einige interne Fragmentierung, wenn Sie die Array-Größe verdoppeln, weil Sie nur eine weitere Zeile benötigen, aber das ist wahrscheinlich etwas, das Sie analysieren um können:
char tmpBuf[LINE_LENGTH + 2]; // account for newline in input buffer
while (fgets(tmpBuf, sizeof tmpBuf, inputFile))
{
/**
* Check to see if you have any room left in your array; if not,
* you'll need to extend it. You'll probably want to factor this
* into its own function.
*/
if (rowsRead == numRows)
{
/**
* Use a temporary variable for the result of realloc in case of failure
*/
char (*tmp)[LINE_LENGTH + 1] =
realloc(fileContents, sizeof *fileContents * (2 * numRows));
if (!tmp)
{
/**
* realloc failed - we couldn't extend the array any more.
* Break out of the loop.
*/
fprintf(stderr, "ERROR: could not extend fileContents array - breaking out of loop\n");
break;
}
/**
* Otherwise, set fileContents to point to the new, extended buffer
* and update the number of rows.
*/
fileContents = tmp;
numRows *= 2;
}
// strip the newline from the input buffer
char *newline = strchr(tmpBuf, '\n');
if (newline)
*newline = 0;
strcpy(fileContents[rowsRead++], tmpBuf);
}
Blick auf http://stackoverflow.com/questions/3536153/c -dynamisch wachsendes Array – Jay
Fragen Sie sich nur, wie man ein 2D-Array dynamisch zuordnet oder wie man es skaliert? So etwas wie 'char (* arr) [CHARS_PER_LINE] = malloc (sizeof (* arr) * NUM_LINES);' vielleicht? – Dmitri
In Ihrem Beispiel hat die erste Zeile ein "(Newline)", aber das zweite nicht. Ist das absichtlich, ein Versehen oder was? – chux