2013-03-19 4 views
0

Я создаю программу, которая должна создать структуру списка людей, введенных пользователем; единственная проблема, с которой я столкнулся, - это ввести пользовательские входные данные в текстовый файл. Кто-нибудь знает, как это сделать? Вот код:Пользовательский ввод в файл

#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; 
} 

ответ

3

Youe Scanf утверждение неверно Вы забыли Ampersand & оператора, прежде чем 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); неправильно синтаксис fputs является:

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

первый аргумент должен быть const char*, но ваш проезжают int

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

Когда ты требуется форматирование inp ет/вывод предпочитает 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); 

EDIT: Потому что и вы, ваш код работает после этих исправлений см

$ 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 
+0

... и почему требуется амперсанд? Если вы собираетесь это объяснить, убедитесь, что вы полностью объяснили это, чтобы люди не путались и начали добавлять амперсанды до PERSON.name в 'scanf («% s », PERSON.name);', который уже указатель.Менее излишним способом сделать это будет ссылка на [руководство scanf] (http://pubs.opengroup.org/onlinepubs/007904975/functions/fscanf.html) и спросить: «Какой тип соответствует«% i 'спецификатор формата?". – Sebivor

+0

Все еще не работает; когда я добавил амперсанд, программа разбилась после ввода возраста. – user2184761

+0

@modifiablelvalue Да, вы правы Я должен добавить это важно здесь –

1

В дополнение к ответу Grijesh в:

Пожалуйста, объясните scanf("%s", &ans);. Сколько персонажей вы можете хранить в ans? Сколько символов требуется для сохранения строки «y»? Подтверждение вашей вероисповедания: 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, который будет читать только один символ в анде.

В качестве альтернативы, если вы измените анс на 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); 
} 
+0

Да, спасибо, добавьте в мой ответ :) –

+0

Если я изменил scanf («% s», &ans); на scanf («% c», & ans), цикл будет – user2184761

+0

@ user2184761 Ну, по крайней мере, 'scanf («% c », & ans)' не является неопределенным поведением. Почему вы предполагаете, что цикл проходит только один раз? Как вы думаете, это потому, что ans содержит что-то, что isn 't' y '? Что это за символ? Как вы думаете, когда вы сталкиваетесь с пробелами, такими как '' \ n'' (например, 'isspace (ans)'), вам может потребоваться «продолжить», чтобы снова зациклиться? – Sebivor

Смежные вопросы