0

我有一个基本上从文件中读取整数的函数:

FILE *file;

file = fopen("filename.txt", "r");
fscanf(file, "%d", &(*pn));
fscanf(file, "%d", &(*pm));
fscanf(file, "%d", &(*pmax));

printf("*pm = %d\n", *pm);
printf("*pn = %d\n", *pn);
printf("*pmax = %d\n", *pmax);

首先,我尝试使用以下文件:

5 4

128

如我所愿,我的输出是正确的:

*pm = 4
*pn = 5
*pmax = 128

但真正的文件是:

P2

5 4

128

我希望我的输出与以前一样,但后来我得到了:

*pm = 0
*pn = 0
*pmax = 0

什么地方出了错?

4

3 回答 3

4

文件开始

P2

用一个字母,而不是一个数字。因此,fscanf所有调用都无法将输入转换为整数,不消耗任何输入。

您应该始终检查函数族的返回值,scanf以捕获由于输入格式错误或流损坏而导致的转换失败。

您可以跳过第一行,例如,

fscanf(file, "%*[^\n]");
于 2013-06-01T00:22:00.077 回答
2

它试图读取一个int,但得到P. 由于无法转换为int,因此它留在流中,并且转换失败。第二个和第三个数字也是如此。

重新读取您的输入,您可能想做一些事情,例如读取一个字符串,然后尝试将其转换为一个 int。您可以使用 阅读%s,然后使用 转换strtol。如果这不能转换,请忽略它并重试。

于 2013-06-01T00:23:26.790 回答
1
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

char *inputString(FILE* fp, size_t size){
//The size is extended by the input with the value of the provisional
    char *str;
    int ch;
    size_t len = 0;
    str = realloc(NULL, sizeof(char)*size);//size is start size
    if(!str)return str;
    while(EOF!=(ch=fgetc(fp)) && isspace(ch));//skip space chars
    ungetc(ch, fp);
    while(EOF!=(ch=fgetc(fp)) && !isspace(ch)){
        str[len++]=ch;
        if(len==size){
            str = realloc(str, sizeof(char)*(size+=16));
            if(!str)return str;
        }
    }
    str[len++]='\0';

    return realloc(str, sizeof(char)*len);
}

enum {false, true };

int readInt(FILE *fp, int *n){
    char *token, *endp;
    long wk;

    for(;;){
        token = inputString(fp, 16);//separated by space character
        if(!*token){//EOF
            free(token);
            return false;
        }
        wk = strtol(token, &endp, 0);
        if(*endp=='\0')break;//success read int
        free(token);
    }
    *n = (int)wk;
    free(token);
    return true;
}

int main(void){
    FILE *file;
    int n, m, max,i;

    n = m = max = 0;
    file = fopen("filename.txt", "r");
    readInt(file, &n);
    readInt(file, &m);
    readInt(file, &max);
/*
    printf("debug:");
    if(readInt(file, &i)==false){
        printf("false\n");
    }
*/
    fclose(file);

    printf("m = %d\n", m);
    printf("n = %d\n", n);
    printf("max = %d\n", max);
    return 0;
}
于 2013-06-01T12:30:26.460 回答