使用malloc和realloc从输入文件到数组

我试图从文件读取输入并使用malloc和realloc将每个字符串放在一个数组中。 所以如果输入文件是:

alex john jane smith 

数组的内容包含{“alex \ n”,“john \ n”,“jane \ n”,“smith \ n”}。 到目前为止,我做过这样的事情:

 int n=0; int size=1; File *fp = fopen(args[0],"r"); int c; char* inputFile; inputFile = (char*) malloc(size); if(fp==0){ fprintf(stderr, "Cannot open file!\n"); return -1;} else{ do{ c = fgetc(fp); inputFile = (char*) realloc(inputFile, size+1); inputFile[n]=c; n++; size++; }while(c!=EOF); 

我相信这个算法最终会得到像这样的数组{‘a’,’l’,’e’,’x’,’\ n’,’j’,’o’,’h’,’n’,’ \ n”, ‘J’, ‘A’, ‘N’, ‘E’, ‘\ n’, ‘S’, ‘M’, ‘I’, ‘T’, ‘H’, ‘\ n’}

如何使inputFile成为二维数组? 我应该怎么做realloc?

您可以尝试以下方法或只研究它是如何完成的。 它在我的linux机器上工作正常。 如果您有任何疑问,请告诉我。

 #include  #include  #include  const int INITIAL_MAX_LINES = 2; const int MAX_LINES_INC = 2; const int INITIAL_MAX_LINE_LENGTH = 2; const int MAX_LINE_LENGTH_INC = 2; int main (int argc, char *argv[]) { int nlines = 0, i; FILE *fp = fopen(argv[1], "r"); char **inputFile, *buffer; int max_lines, c, buflen, bufpos, end_of_line; if (argc < 2) { printf("No enough arguments.\n"); return -1; } max_lines = INITIAL_MAX_LINES; inputFile = (char **) malloc(max_lines * sizeof(char*)); if (fp==0) { fprintf(stderr, "Cannot open file!\n"); return -1; } else{ /* Start with a buffer. */ bufpos = 0; buflen = INITIAL_MAX_LINE_LENGTH; buffer = (char *) malloc(buflen * sizeof(char *)); c = 0; while (c != EOF) { end_of_line = 0; c = fgetc(fp); if (c == EOF || c == '\n' || c == '\r') { end_of_line = 1; /* Discard this character. */ } else { /* Put this character in the buffer. */ /* But check if we have enough memory first! */ /* Leave room for the null character at the end. */ if (bufpos >= buflen - 1) { buflen += MAX_LINE_LENGTH_INC; buffer = (char *) realloc(buffer, buflen * sizeof(char)); } buffer[bufpos] = c; bufpos++; } if (end_of_line) { /* Remember this line and get a new buffer. */ /* Check if we need more memory. */ if (nlines >= max_lines) { max_lines += MAX_LINES_INC; inputFile = (char **) realloc(inputFile, max_lines * sizeof(char*)); } /* Null terminate the buffer.*/ buffer[bufpos++] = 0; inputFile[nlines] = buffer; nlines++; bufpos = 0; buflen = INITIAL_MAX_LINE_LENGTH; buffer = (char *) malloc(buflen * sizeof(char *)); } } } printf("%d lines\n", nlines); for (i=0; i 

你想要首先分配一个指针数组,初始大小为10:

 int size = 10; char **inputFile= malloc(sizeof*inputFile*size); 

然后,对于您阅读的每个单词,为其分配更多内存并将其插入到数组中:

 char line[100]; fscanf(file, "%s", line); inputFile[index++] = strdup(line); 

现在检查是否需要更多单词然后重新分配数组:

 if (index==size) { size += 10; inputFile = realloc(inputFile, sizeof*inputFile*size); } 

所以你最终得到这样的东西:

 [0]->"alex" [1]->"john" [2]->"jane" [3]->"smith" 

当你完成后,你需要循环数组并释放每个字符串然后释放数组,这部分留作练习:)