Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C:EOF检测和测试;fgetc_C_Eof_Fgetc - Fatal编程技术网

C:EOF检测和测试;fgetc

C:EOF检测和测试;fgetc,c,eof,fgetc,C,Eof,Fgetc,目标: 如何成功实现EOF以停止无限循环 调用函数的部分: do { pId = readInputField(fptr, DELIMITER_SPACE); pName = readInputField(fptr, DELIMITER_SEMICOLON); pDob = readInputField(fptr, DELIMITER_SPACE); pHobbyList = readInputField(fptr, DELIMITER_NEWLINE); } w

目标: 如何成功实现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
函数定义:

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
样本输出:

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
我想看看上面的返回语句。出于某种原因,它无法检测是否为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;
}
//刷新:如果找到空格
''==(缓冲字符串[numCharRead]=fgetc(fPtr))?0:numCharRead++;
if(缓冲字符串[numCharRead-1]==EOF)
返回NULL;
while(分隔符!=bufferString[numCharRead-1]
&&numCharRead<最大长度\输入){
bufferString[numCharRead++]=fgetc(fPtr);
/*检查EOF*/
if(缓冲字符串[numCharRead-1]==EOF)
返回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
      的内存的指针,从而导致内存泄漏(以及稍后尝试
      释放该指针时可能发生的崩溃)

      然后返回
      pBufferString
      ,它现在指向本地数组,导致未定义的行为,因为本地数组占用的堆栈内存在函数返回后不再有效

      除了上述问题之外,您还可以根据需要分配四到八倍的内存。指针的大小是四个或八个字节(取决于您是在32位还是64位平台上),但是
      char
      只有一个字节。使用
      strlen(bufferString)+1
      作为分配的大小就足够了:

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

      您需要
      +1
      ,因为字符串长度中不包含字符串终止符。

      请记住
      fgetc
      返回的是
      int
      而不是
      char
      。哦,您遇到了一个更糟糕的问题:返回一个指向局部变量的指针。@JoachimPileborg谢谢。我更新了上面的代码以修复指针问题。关于
      fgetc
      ,我甚至没有收到任何警告,结果与预期一样。您建议如何替换
      fgetc
      ?您分配的内存几乎是所需内存的四到八倍
      sizeof(char*)
      为4或8。分配
      strlen(…)+1
      字节就足够了。您应该使用
      strcpy
      来复制字符串,现在您将指针更改为指向局部变量(因此仍然返回指向局部变量的指针)。
      ''==(bufferString[numCharRead]=fgetc(fPtr))?0:numCharRead++。。。这是一种非常复杂的表达
      if((bufferString[numCharRead]=fgetc(fPtr)))numCharRead++。非常感谢Rohan!无限循环发生在刷新中。我修改了代码;它没有停止无限循环!现在,情况更清楚了。我感谢你的意见!您将如何替换上述代码中的
      fgetc
      fgetc
      返回
      int
      ,而不是
      char
      ,这有什么意义?@JaneBerman从技术上讲
      255
      是一个有效字符。不幸的是,如果使用
      char
      ,它也可以被视为-1-对于
      char
      而言,1与对于
      int
      而言-1不同。