0

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

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);
}
4

3 回答 3

1

用于fgets一次读取一行。

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

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

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

于 2013-11-07T22:09:35.857 回答
0

同意@paddy,使用字符串存储电话号码。(应对前导 0、变体长度、#、*、暂停等)。还不如确保它足够大int64_t
注意:网络上有 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);
}
于 2013-11-08T21:20:25.023 回答
0

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

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

要记住的事情:

  • 必须检查转换错误
  • 这种方法对输入错误的容忍度较低(如果使用fgets()它可能更容易恢复和删除格式错误的条目 - 除非记录的字段数错误)。
于 2013-11-07T22:55:16.187 回答