fscanf结构数组

时间:2013-11-07 21:59:59

标签: c input structure scanf

我正在尝试从文本文件中获取一些输入,将其放入结构中并将其打印出来。示例文本文件如下所示:

2
Curtis
660-------
Obama
2024561111

(第一个数字的数字冲出来(隐私),第二个是Whitehouse.gov,我打电话,他们帮不了我。)

示例输出:

204-456-1111 Obama
660--------- Curtis

(当我弄清楚剩下的时候,格式化和排序应该不是问题。)

我的问题用下面的问号标记(在第一个FOR循环中,我如何从文本文件中获取特定的行来创建结构?

#include <stdio.h>
#include <string.h>

struct telephone {
char name[80];
long long int number;
}

main() {

struct telephone a, b;
char text[80];
int amount, i;

FILE *fp;
fp = fopen("phone.txt", "r");
fscanf(fp, "%d", amount);
struct telephone list[amount];

for(i = 0; i < amount; i++) {
    strcpy(list[i].name, ???);
    list[i].number, ???);
}
fclose(fp);

for(i = 0; i < amount; i++) {
    DisplayStruct(list[i]);
}
}

DisplayStruct(struct telephone input) {
printf("%lld %s\n", input.number, input.name);
}

3 个答案:

答案 0 :(得分:1)

使用fgets一次读取一行。

int lnum = 0;
char line[100];
while( fgets(line, sizeof(line), fp) ) {
    lnum++;
    printf( "Line %d : %s\n", lnum, line );
}

然后,您可以使用sscanfstrtok或许多其他方法从您刚刚阅读的字符串中提取数据。

我建议不要将您的电话号码存储为整数。电话号码更好地表示为字符串。

答案 1 :(得分:0)

如果您可以保证名称和电话号码都没有空格,您可以使用fscanf()来读取此数据:

for(i = 0; i < amount; i++) {
    fscanf("%s %lld", list[i].name, &list[i].phone);
}

要记住的事情:

  • 必须检查转换错误
  • 此方法对输入错误的容忍度较低(如果使用fgets(),则可能更容易恢复并删除格式错误的条目 - 除非记录的字段数量错误。)

答案 2 :(得分:0)

同意@paddy,使用字符串存储电话号码。 (处理前导0,变量长度,#,*,暂停等)。也可以确保它足够大int64_t 注意:Web上有22位数的示例。

struct telephone {
  char name[80];
  char number[21];
}

读入数据......

for (i = 0; i < amount; i++) {
  // +1 for buffer size as string read has a \n which is not stored.
  char na[sizeof list[0].name + 1];
  char nu[sizeof list[0].number + 1];
  if ((fgets(na, sizeof na, fp) == NULL) || (fgets(nu, sizeof nu, fp) == NULL)) {
    break; // TBD, Handle unexpected missing data
  }
  // The leading space in the format will skip leading white-spaces.
  if (1 != sscanf(na, " %79[^\n]", list[i].name)) {
    break; // TBD, Handle empty string
  }
  if (1 != sscanf(na, " %20[^\n]", list[i].number)) {
    break; // TBD, Handle empty string
  }
}
if (fgetc(fp) != EOF) {
  ; // Handle unexpected extra data
}
amount = i;

// Pass address of structure
for(i = 0; i < amount; i++) {
  DisplayStruct(&list[i]);
}

void DisplayStruct(const struct telephone *input) {
  if (strlen(input->number) == 10) {
    printf("%.3s-%.3s-%4s", input->number, &input->number[3], &input->number[6]);
  }
  else { // tbd format for unexpected telephone number length
    printf("%13s", input->number);
  }
  // Suggest something around %s like \"%s\" to encapsulate names with spaces
  printf(" %s\n", input->name);
}