c – 使用fgets和strtok从文件中读取和解析行
发布时间:2020-12-16 07:35:10 所属栏目:百科 来源:网络整理
导读:我在使用相当基本的代码时遇到了麻烦.我需要从下面显示的文件中读取每一行,用strtok将它分成3个部分,并将每个部分存储到一个数组中. “目标”和“助手”的数组工作正常,但由于某种原因,整个名称数组都填充了从文件中读取的姓氏. 输入文件: Redden 2 0Berglu
我在使用相当基本的代码时遇到了麻烦.我需要从下面显示的文件中读取每一行,用strtok将它分成3个部分,并将每个部分存储到一个数组中. “目标”和“助手”的数组工作正常,但由于某种原因,整个名称数组都填充了从文件中读取的姓氏.
输入文件: Redden 2 0 Berglund 5 2 Jackman 2 0 Stewart 4 0 Oshie 3 5 McDonald 2 4 Pietrangelo 2 7 Perron 2 6 Tarasenko 5 5 相关代码: int main(int argc,char* argv){ FILE* inFile = fopen(argv[1],"r"); char ** nameArray; int * goalArray; int * assistArray; int size = countLinesInFile(inFile); allocateMemory(&goalArray,&assistArray,&nameArray,size); readLinesFromFile(inFile,goalArray,assistArray,nameArray,size); } void allocateMemory(int** goals,int** assists,char*** names,int size) { *goals = malloc(size*sizeof(int)); *assists = malloc(size*sizeof(int)); *names = malloc(size*sizeof(char *)); int i; for(i=0; i<size; i++) { *(*names + i) = calloc(MAX_NAME,sizeof(char)); } } void readLinesFromFile(FILE* fPtr,int* goals,int* assists,char** names,int numLines) { int i; char * buffer = malloc(MAX_LINE*sizeof(char)); for(i = 0; i<numLines; i++) { if(fgets(buffer,MAX_LINE,fPtr)!= NULL) { names[i] = strtok(buffer," n"); goals[i] = atoi(strtok(NULL," n")); assists[i] = atoi(strtok(NULL," n")); } } } 出于某种原因,nameArray [0-9]都包含“Tarasenko”,对此的任何帮助将不胜感激. 解决方法strtok 返回一个指向包含下一个标记的以null结尾的字符串的指针.要实际复制此令牌,您应该使用
strcpy :
strcpy(names[i],strtok(buffer," n")); strcpy(goals[i],atoi(strtok(NULL," n"))); strcpy(assists[i]," n"))); 另请注意,代码中存在内存泄漏: void readLinesFromFile(/*...*/) { char * buffer = malloc(MAX_LINE*sizeof(char)); // ... fgets(buffer,fPtr); // ... } 您通过调用malloc动态分配缓冲区,但不释放此内存.不要忘记在指向由malloc分配的内存的指针上调用 void readLinesFromFile(/*...*/) { char buffer[MAX_LINE]; // ... fgets(&buffer,fPtr); // ... } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |