有没有办法逐个字符地为字符读取文件和为数字设置的数字?
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
}
答案 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;
}