为字符逐个字符读取文件和为数字设置的数字

时间:2014-01-12 03:28:24

标签: c

有没有办法逐个字符地为字符读取文件和为数字设置的数字?

bob 4567
joe 39083
sara 4239824

这是我的档案

while ((c = fgetc(pFile)) != EOF)
{
    //my work
}

我知道这适用于我的角色。这不会以我想要的方式读取数字。这读取b,o,b,空格,4,5,6,7。我想要它读b,o,b,空格,4567。原因是我最终将添加4567 plus 39083 plus 4239824。

更新12-20

如果文件不一致,那么fscanf可以处理它吗?有时文件是“字号”,有时它只是“字”。像这样。

bob 456
echo
cat 
dog 1101
peacock 300

这似乎有效,我对此感到惊讶。我不认为fsacnf喜欢不一致的文件。

while (fscanf(pFile, "%s %d",  nam, &val) !=EOF)
{
    //my work
}

2 个答案:

答案 0 :(得分:4)

您可以将数字读入数组,然后使用int或(最好)atoi将其转换为strtol

或者,您可以阅读这些字母,然后在到达空格时停止,并使用类似[f]scanf的内容读取数字(当然,您可以使用[f]fscanf阅读全部内容)。

编辑:

如果有选择,我可能会做类似的事情:

char name[16];
int number;

fscanf(input_file, "%15s %d", name, &number);

答案 1 :(得分:1)

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

enum { SPACE, STRING, NUMBER, END };

int main(void){
    FILE *pFile = stdin;//Mock
    char buffer[32];
    int i, c, kind, number;
    unsigned long long sum =0;

    i = 0; kind = SPACE;
    while((c = fgetc(pFile)) != EOF){//&& i< suzeof(buffer)
        buffer[i] = c;
        if(isdigit(c)){
            kind = NUMBER;
            ++i;
        } else if(isspace(c)){
            buffer[i] = '\0';
            if(kind == STRING){
                printf("%s\n", buffer);
            } else if(kind == NUMBER){
                number = atoi(buffer);
                printf("%d\n", number);
                sum += number;
            }
            kind = SPACE;
            i = 0;
        } else {
            kind = STRING;
            ++i;
        }
    }
    printf("sum : %llu\n", sum);
    return 0;
}