用户输入到文件

时间:2013-03-19 02:44:36

标签: c file text io

我正在创建一个程序,该程序应该创建用户输入的人员列表的结构;我遇到的唯一问题是让用户输入数据出现在文本文件中。有人知道怎么做吗?这是代码:

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

struct person{
    char name[20];
    int age;
    struct person *next_ptr;
    } PERSON;

int main (void){


struct person PERSON;

FILE *fp;
char ans, ch;
int ppl=0;

fp=fopen("person_struct", "w");

if(fp != NULL){

while(ppl<25){


printf("Would you like to add a person to the list? [y/n]  ");
scanf("%c", &ans);

if(ans == 'y') {
    printf("\nEnter a name:\n");
    scanf("%s", PERSON.name);
    fprintf(fp, "%s",PERSON.name);  
    printf("\nEnter age:\n"); 
    scanf("%i", &PERSON.age);
    fprintf(fp, "  %i\n", PERSON.age);
} 
else {
  ppl=25;       
}

ppl++;
}
fclose(fp);
}   
printf("\n\n\n");
system("pause");
return 0;
}

2 个答案:

答案 0 :(得分:3)

你知道scanf语句是错的,你在&之前忘记了&符号PERSON.age运算符

scanf("%i", PERSON.age);
           ^ & missing  

正确的是:

scanf("%i", &PERSON.age);

您的代码中有两个scanf雄蕊,用于输入一个用于字符串到扫描名称的用户。

scanf("%s", PERSON.name); 

这是正确的,在字符串之前不需要&。但是年龄为int并且要扫描int.float,您需要在变量之前添加&,这就是在PERSON.age之前添加&符号&的原因。 参考:scanf

第二名:

fputs(PERSON.age, fp);错误的fput语法是:

int fputs( const char *str, FILE *stream );
                   ^ you are passing int

第一个参数应该是const char*,但您正在传递int

fputs(PERSON.age, fp);
       ^ wrong , age is int not char*

当你需要格式化输入/输出更喜欢printf和scanf函数时,我的建议改变你的读/写如下:(读评论

printf("Enter a name:\n"); 
scanf("%s", PERSON.name);  // here is No & because `name` is string 
scanf("%i", &PERSON.age);  // age is `int` so & needed 
fprintf(fp,"%s %i\n",PERSON.name, PERSON.age);

编辑:因为您评论过,您的代码在完成这些整改后正在运行,请参阅

$ gcc x.c -Wall
$ ./a.out 
Would you like to add a person to the list? [y/n]y
Enter a name:
yourname
14
Would you like to add a person to the list? [y/n]y
Enter a name:
firendName
15
Would you like to add a person to the list? [y/n]n
sh: 1: pause: not found
$ cat person_struct.txt
yourname 14 
firendName 15 

答案 1 :(得分:1)

除了Grijesh的回答:

请解释scanf("%s", &ans);。你可以在ans中存储多少个字符?字符串&#34; y&#34;需要存储?验证您的信念:printf("sizeof ans: %zu\n" "sizeoof \"y\": %zu\n", sizeof ans, sizeof "y");

也许你的意思是:if (scanf("%c", &ans) != 1) { /* assume stdin has closed or reached EOF */ }。请注意%c,其中只能将一个字符读入ans

或者,如果您将ans更改为int,则可以使用:ans = getchar();

编辑:简而言之,我认为你的循环应该是这样的:

for (size_t ppl = 0; ppl < 25; ppl++){
    int ans;

    printf("Would you like to add a person to the list? [y/n]");
    do {
        ans = getchar();
    while (ans >= 0 && isspace(ans));

    if (ans != 'y') {
        break;
    }

    printf("Enter a name:\n");
    if (scanf("%s", PERSON.name) != 1 || scanf("%i", &PERSON.age) != 1) {
        break;
    }
    fprintf(fp, "%s %i\n", PERSON.name, PERSON.age);
}