gpt4 book ai didi

c - 使用 fgets 和 strtok 从文件中读取和解析行

转载 作者:太空狗 更新时间:2023-10-29 15:38:57 26 4
gpt4 key购买 nike

我在处理一段相当基本的代码时遇到了问题。我需要从下面显示的文件中读取每一行,用 strtok 将其分成 3 个部分,并将每个部分存储到一个数组中。 “goals”和“assists”的数组工作得很好,但由于某种原因,整个名称数组都填满了从文件中读取的姓氏。

输入文件:

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返回指向包含下一个标记的空终止字符串的指针。要实际复制此 token ,您应该使用 strcpy :

strcpy(names[i],    strtok(buffer,      " \n"));
strcpy(goals[i], atoi(strtok(NULL, " \n")));
strcpy(assists[i], atoi(strtok(NULL, " \n")));

另请注意,您的代码中存在内存泄漏:

void readLinesFromFile(/*...*/)
{
char * buffer = malloc(MAX_LINE*sizeof(char));
// ...
fgets(buffer, MAX_LINE, fPtr);
// ...
}

您通过调用malloc 动态分配了buffer,但是您没有释放这 block 内存。不要忘记调用free()在指向由 malloc 分配的内存的指针上。但在这种情况下,自动存储时长的数组会是更好的选择:

void readLinesFromFile(/*...*/)
{
char buffer[MAX_LINE];
// ...
fgets(&buffer, MAX_LINE, fPtr);
// ...
}

关于c - 使用 fgets 和 strtok 从文件中读取和解析行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15033140/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com