簡體   English   中英

使用fgets和strtok從文件讀取和解析行

[英]Reading and parsing lines from a file with fgets and strtok

我在相當基本的代碼方面遇到了麻煩。 我需要從下面顯示的文件中讀取每一行,使用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返回的指針放入數據結構中。 您最終將得到一個數據結構,該數據結構包含指向buffer指向的相同內存的相同指針。 由於buffer的內容在每次循環中都會被修改,因此最終會得到一堆指向最后一次指針的指針。

strtok返回指向包含下一個標記的以空值終止的字符串的指針。 要實際復制此令牌,應使用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 ,但不會釋放此內存。 不要忘記在指向malloc分配的內存的指針上調用free() 但是在這種情況下,具有自動存儲持續時間的陣列將是一個更好的選擇:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM