2016-04-10 41 views
0

输入文件:记录由制表符分隔

Joe Smith 10 Main St. 555-1212 

我读从具有包含3个字段,名称,住所和由制表符分隔电话号码以上格式的文件记录。

while (fscanf(fp, "%s%s%s", rec[size].name, rec[size].address, rec[size].phone_number) != EOF) 
{ 
    size++; 
} 

我必须包括第一个单词的空格,忽略标签并开始阅读下一个字段。

+0

你的问题到底是什么? –

+0

请注意,您应该检查'while(fscanf(fp,...)== 3)',因为这会告诉您是否存在文件中只剩下两个字段的问题。另外请注意,'fscanf()'对于面向行的输入的使用有限 - 它不关心换行符出现的位置,并且会对分布在三行上的信息感到满意。使用'fgets()'或'getline()'然后'sscanf()'来解析输入行。 –

回答

1
char buffer[4096]; 
int n; 

while (fgets(buffer, sizeof(buffer), fp) != 0) 
{ 
    if ((n = sscanf(buffer, "%[^\t] %[^\t] %[^\t\n]", 
     rec[size].name, rec[size].address, rec[size].phone_number)) != 3) 
    { 
     if (n != EOF) 
      fprintf(stderr, "Error: faulty record without 3 fields at:\n%s", 
        buffer); 
     break; 
    } 
    size++; 
} 

请注意,这使用fgets()来读取行。它检查sscanf()是否读取三个字段。你不应该得到n == EOF,但测试以防万一。错误消息以标准错误报告,并且包含导致问题的行(fgets()加上sscanf()的主要优点之一在于您有为重试或错误报告捕获的行)。