2015-10-05 50 views
1

目前我正在学习C. 从文件中读取反正切正题:Ç如何使用sscanf的正确支持

文本文件的内容:

123456 James Doakes; 0 
987987 Dexter Morgan; 0 
010203 Masuka Perv; 0 

int main() 
{ 
char accountNr[ACCOUNTNRSIZE], ownerName[NAMESIZE], enter[3]; 
int accountBalance = 0; 
char filename[] = "breg.txt"; 
FILE *file = fopen(filename, "r"); 
if (file != NULL) { 
    char line[128]; 
    while (fgets(line, sizeof(line), file) != NULL) { 
     sscanf(line, "%s %[^;] %d ", accountNr, ownerName, &accountBalance); 
     printf("%s", ownerName); 
     //fflushstdin(); 
    } 
    fclose(file); 
} else { 
    perror(filename); 
} 
return 0; 
} 

我写这个来检查例如James Doakes的名字是否正确注册:

printf("%s", ownerName); 

但是,当它打印出来就像标准输出仍然是活动的,我可以推动回车,它会再次输入名称。我的目标当然是能够将数字,全名和最后一个数字作为单独变量进行扫描。但它显然不起作用。我猜测\ n也会被注册。不知道,我只是在猜测。

我在做什么错?为什么?我该如何解决这个问题?

非常感谢, 米夫

+0

尝试'sscanf(line,“%s%[^;];%d”,accountNr,ownerName,&accountBalance);'或检查其返回值,int r = sscanf(line,“%s%[^ ;];%d“,accountNr,ownerName,&accountBalance);如果(r == 3)/ * accountNr,ownerName和accountBalance扫描成功*/else if(r == 2)/ * aaccountNr和ownerName扫描成功*/else if(r == 1)/ * aaccountNr扫描成功* /其他/ *没有扫描成功:(* /' –

+0

当打印ownerName:'printf(“%s \ n”,ownerName)时还要添加一个''n'';' – chqrlie

回答

3
%s %[^;] %d 

指由空格,可选空格中,不是;,可选空格,那么号码的字符序列所终止的字符串。

你似乎是不扫描实际;人物本身,这样,当你尝试获得号,;输入流中会导致失败。

#include <stdio.h> 

#define ACCOUNTNRSIZE 100 
#define NAMESIZE 100 

int main (void) { 
    char accountNr[ACCOUNTNRSIZE], ownerName[NAMESIZE], enter[3]; 
    int accountBalance = 0; 
    char filename[] = "breg.txt"; 
    FILE *file = fopen(filename, "r"); 
    if (file != NULL) { 
     char line[128]; 
     while (fgets(line, sizeof(line), file) != NULL) { 
      int count = sscanf(line, "%s %[^;] %d ", accountNr, ownerName, &accountBalance); 
      printf ("%d [%s] [%s] [%d]\n", count, accountNr, ownerName, accountBalance); 
     } 
     fclose(file); 
    } else { 
     perror(filename); 
    } 
    return 0; 
} 

它输出:你可以看到这个

2 [123456] [James Doakes] [0] 
2 [987987] [Dexter Morgan] [0] 
2 [010203] [Masuka Perv] [0] 

事实上,即使你改变breg.txt文件是:

123456 James Doakes; 314159 
987987 Dexter Morgan; 271828 
010203 Masuka Perv; 42 

你仍然得到0的帐户因为扫描只能成功读取两个项目。


每当您使用的scanf - 家庭功能之一,你应该检查返回代码,以确保它的扫描项目的正确的号码,如:

int count = sscanf (line, "%s %[^;] %d ", accountNr, ownerName, &accountBalance); 
if (count != 3) { 
    fprintf (stderr, "Catostrophic failure, count is %d\n", count); 
    return 1; 
} 

的修复这里相对简单,只需使用%s %[^;]; %d作为格式字符串。

随着这种变化,你可以看到输出是:

3 [123456] [James Doakes] [314159] 
3 [987987] [Dexter Morgan] [271828] 
3 [010203] [Masuka Perv] [42] 

记住你实际上并不需要之前%d的空间(虽然它不会造成伤害)。该特定格式说明符在尝试扫描数字之前跳过空格。

+0

完美,我也意识到我可能是在昨天的正确轨道上,但作为一个新手,你不知道问题出在哪里,所以你最终试图修复好的代码,认为它的代码不好。谢谢! –

相关问题