使用fscanf

时间:2016-05-26 13:22:19

标签: c

所以我想从一个用空格分隔的文本文件中读取一些字符串。我一直在使用的代码是:

int main() {
  char name[9];
  char surname[20];
  char phone[10];
  int code, nscan;
  char termch;
  FILE* infile;

 infile = fopen("I4F6.txt", "r");
if (infile == NULL)
 printf("Error reading text file\n");


 while (TRUE){

nscan= fscanf(infile, "%[^ ] %[^ ] %[^ ] %d%c",
                         name, surname, phone, &code, &termch);


 printf("%s %s %s %d\n", name ,surname, phone, code);


  if (nscan == EOF)
    break;
  if (nscan != 5 || termch != '\n')
    printf("Error line\n");
  }   
   return 0;
}     

文本文件是这样的,首先是名字,然后是姓氏,需要保存为字符串和代码的电话号码。

nikos dimitriou 6911111112 1
maya satratzemi 6933333332 20
marios nikolaou 6910001112 15
maria giannou 6914441112 1
dimitra totsika 6911555111 14
giannis pappas 6911111222 16
nikos ploskas 6911111662 20

但是我从这个printf得到的结果是:

nikos  6911111112 1

maya  6933333332 20

marios  6910001112 15

maria  6914441112 1

dimitra  6911555111 14

giannis  6911111222 16

nikos  6911111662 20

Error line
nikos  6911111662 20   

因此,您可以看到它会跳过所有姓氏并产生错误行。

那么我该怎么做才能读取并将文本文件中用空格分隔的每个值存储到变量中?

感谢您的时间

1 个答案:

答案 0 :(得分:0)

OP的关键问题是使用char phone[10];来存储需要11 "6911111112"的{​​{1}}。这一切都导致无限char

的未定义行为
  

我该怎么做才能读取并将文本文件中用空格分隔的每个值存储到变量中?

%[^ ]很难用于检测而不会被*scanf()等行结尾所迷惑。最好阅读,然后解析它并使用宽度限制字段。

考虑使用"\r\n"(它存储扫描偏移)来检测正确的扫描。

%n