[英]from input file to array using malloc and realloc
I am trying to read input from a file and put each string in an array using malloc and realloc. 我正在尝试从文件中读取输入,并使用malloc和realloc将每个字符串放入数组中。 So if the input file is :
因此,如果输入文件是:
alex
john
jane
smith
the content of array contain {"alex\\n", "john\\n", "jane\\n", "smith\\n"}. 数组的内容包含{“ alex \\ n”,“ john \\ n”,“ jane \\ n”,“ smith \\ n”}。 So far I have done something like this:
到目前为止,我已经做了类似的事情:
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);
I believe this algorithm will end up with array like this {'a','l','e','x','\\n','j','o','h','n','\\n','j','a','n','e','\\n','s','m','i','t','h','\\n'} 我相信该算法将以这样的数组结尾:{'a','l','e','x','\\ n','j','o','h','n',' \\ n','j','a','n','e','\\ n','s','m','i','t','h','\\ n'}
how can I make the inputFile become 2 dimension array? 如何使inputFile成为2维数组? what should I do with realloc?
我应该如何处理realloc?
you would want to allocate an array of pointers first with an initial size say 10: 您可能想先分配一个指针数组,其初始大小为10:
int size = 10;
char **inputFile= malloc(sizeof*inputFile*size);
Then for each word you read you allocate more memory for it and insert it into the array: 然后,对于每个阅读的单词,您为其分配更多的内存,并将其插入数组:
char line[100];
fscanf(file, "%s", line);
inputFile[index++] = strdup(line);
Now check if you need more words then you realloc the array: 现在检查是否需要更多单词,然后重新分配数组:
if (index==size) {
size += 10;
inputFile = realloc(inputFile, sizeof*inputFile*size);
}
So you end up with something like this: 因此,您最终会得到如下结果:
[0]->"alex"
[1]->"john"
[2]->"jane"
[3]->"smith"
When you're done you need to loop over the array and free each string and then free the array, this part is left as an exercise :) 完成后,您需要遍历数组并释放每个字符串,然后释放数组,这部分留作练习:)
You can try the following or just study how it's done. 您可以尝试以下操作,也可以研究如何完成。 It works fine on my linux machine.
它在我的linux机器上工作正常。 Let me know if you have any questions.
如果您有任何疑问,请告诉我。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
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<nlines; i++) {
printf("%s\n", inputFile[i]);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.