Если вы хотите сохранить каждую строку файла в виде строки в массиве, используйте 2D массив char
:
char fileContents[NUM_LINES][LINE_LENGTH + 1]; // +1 for zero terminator
Если вы не знаете, сколько строк у вас есть фронт, вам Мне нужно будет немного управления памятью.Во-первых, вам нужно выделить начальную степень:
#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
Как читать из файла, вы будете проверять, чтобы убедиться, что у вас есть место в массиве; если вы этого не сделаете, вам необходимо расширить массив с помощью вызова realloc
, что является потенциально дорогостоящей операцией. Общим методом является удвоение размера массива каждый раз, когда вы его расширяете, что сводит к минимуму общее количество звонков realloc
. Риск является некоторой внутренней фрагментацией, если удвоить размер массива, потому что вам нужно всего лишь еще один ряд, но это, вероятно, что-то вы можете проанализировать вокруг:
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);
}
Посмотрите на http://stackoverflow.com/questions/3536153/c -dynamically-growth-array – Jay
Вам интересно, как динамически выделять 2D-массив или как его изменить? Что-то вроде: 'char (* arr) [CHARS_PER_LINE] = malloc (sizeof (* arr) * NUM_LINES);' может быть? – Dmitri
В вашем примере на первой строке есть «(новая строка)», а вторая - нет. Это намеренно, надзор или что? – chux