我正在尝试从文本文件中获取一些输入,将其放入结构中并将其打印出来。示例文本文件如下所示:
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);
}
答案 0 :(得分:1)
使用fgets
一次读取一行。
int lnum = 0;
char line[100];
while( fgets(line, sizeof(line), fp) ) {
lnum++;
printf( "Line %d : %s\n", lnum, line );
}
然后,您可以使用sscanf
或strtok
或许多其他方法从您刚刚阅读的字符串中提取数据。
我建议不要将您的电话号码存储为整数。电话号码更好地表示为字符串。
答案 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);
}