簡體   English   中英

C:EOF檢測和fgetc

[英]C: EOF detection & fgetc

目標:如何成功實現EOF以阻止無限循環?

調用函數的部分:

do {
    pId = readInputField(fptr, DELIMITER_SPACE);
    pName = readInputField(fptr, DELIMITER_SEMICOLON);
    pDob = readInputField(fptr, DELIMITER_SPACE);
    pHobbyList = readInputField(fptr, DELIMITER_NEWLINE);
} while (NULL != pId
         && NULL != pName
         && NULL != pDob
         && NULL != pHobbyList);

功能定義:

char* readInputField(FILE* fPtr, const char delimiter) {
    int numCharRead;
    char bufferString[MAX_LENGTH_INPUT];
    char *pBufferString;

    numCharRead = 0;

    // flush: if spaces are found
    ' ' == (bufferString[numCharRead] = fgetc(fPtr)) ? 0 : numCharRead++;

    // get chracter array before delimiter
    while (delimiter != bufferString[numCharRead - 1]
            && numCharRead < MAX_LENGTH_INPUT) {
        bufferString[numCharRead++] = fgetc(fPtr);
    }

    // exclude delimiter from the string
    bufferString[numCharRead - 1] = '\0';

    printf("numCharRead=  \"%d\"\n", numCharRead);

    printf("delimiter:    \"%c\"\n", delimiter);
    printf("bufferString: \"%s\"\n", bufferString);

    pBufferString = malloc(sizeof(char*) * strlen(bufferString));

    /* deleted:
    pBufferString = bufferString;
    return EOF == bufferString[numCharRead - 1] ? NULL : pBufferString;
    */
}

樣本輸入:

VIC Lee, Victoria; 02/25/90 Knitting;Photography;Dance;

樣本輸出:

numCharRead=  "4"
delimiter:    " "
bufferString: "VIC"
numCharRead=  "14"
delimiter:    ";"
bufferString: "Lee, Victoria"
numCharRead=  "9"
delimiter:    " "
bufferString: "02/25/90"
numCharRead=  "28"
delimiter:    "
"
bufferString: "Knitting;Photography;Dance;"

// after this, infinite loop begins with garbage data

我的電話是查看上面的return語句。 由於某種原因,它不會檢測它是否是EOF。

任何幫助表示贊賞! 謝謝!


更新:謝謝@JoachimPileborg! 我在下面更新了我的代碼:

  // check for EOF
    if(bufferString[numCharRead-1] == EOF) {
        return NULL;
    } else {
        pBufferString = malloc(sizeof(char*));
        strcpy(pBufferString, bufferString);
        return pBufferString;
    }

檢查您從文件中讀取的EOF ,如

// flush: if spaces are found
' ' == (bufferString[numCharRead] = fgetc(fPtr)) ? 0 : numCharRead++;
if(bufferString[numCharRead-1] == EOF)
    return NULL;

while (delimiter != bufferString[numCharRead - 1]
            && numCharRead < MAX_LENGTH_INPUT) {
    bufferString[numCharRead++] = fgetc(fPtr);
    /* check for EOF */
    if(bufferString[numCharRead-1] == EOF)
        return NULL;
}

你也有@Joachim Pileborg評論中提到的問題

  • fgetc返回int而不是char
  • 您正在返回bufferString ,它是函數的本地。

無法在評論中編寫代碼,因此我將其作為答案發布。

您在問題中擁有(或至少擁有)此代碼:

pBufferString = malloc(sizeof(char*) * strlen(bufferString));
pBufferString = bufferString;
return EOF == bufferString[numCharRead - 1] ? NULL : pBufferString;

在上面的第一行中,您分配內存並使pBufferString指向該內存。

在第二行中,然后使pBufferString指向本地數組bufferString ,因此您不再具有指向使用malloc分配的內存的指針,從而導致內存泄漏(以及稍后嘗試free該指針時可能發生的崩潰)。

然后返回pBufferString ,它現在指向本地數組,導致未定義的行為,因為本地數組占用的堆棧內存在函數返回后不再有效。

除了上面的問題,你可以根據需要分配幾乎四到八倍的內存。 指針的大小是四個或八個字節(取決於您是在32位還是64位平台上),但char只有一個字節。 使用strlen(bufferString) + 1作為要分配的大小就足夠了:

pBufferString = malloc(strlen(bufferString) + 1);

您需要+ 1因為字符串終止符不包含在字符串長度中。

暫無
暫無

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

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