2015-02-09 2 views
1

Пользователь вводит для 2 студентов имя, идентификатор, дату рождения, пол и семейное положение. Затем я должен писать каждый вход в файл. Это мой код.C - write() входные данные в файл

#include <unistd.h> 
#include <fcntl.h> 
#include <stdio.h> 

int main() 
{ 
    int fd, i; 
    char name[20], id[10], dob[10], gender[7], status[10]; 
    fd = open("lab45.txt", O_WRONLY|O_CREAT, S_IRWXU); 
    for (i = 1; i < 3; i = i + 1) 
    { 
     printf("\n\nStudent %d", i); 
     printf("\n-Name: "); 
     scanf(" %[^\n]", name); 
     printf("\n-ID: "); 
     scanf("%s", id); 
     printf("\n-Date of birth: "); 
     scanf("%s", dob); 
     printf("\n-Gender: "); 
     scanf("%s", gender); 
     printf("\n-Marital status: "); 
     scanf("%s", status); 
     write(fd, &name, 20); 
     write(fd, &id, 10); 
     write(fd, &dob, 10); 
     write(fd, &gender, 7); 
     write(fd, &status, 10); 
    } 
    close(fd); 
} 

Я ввожу следующее:

Студент 1

-Name: John Smith

-ID: JS3019

-Date рождения: 14/10/90

-Gender: мужчина

-Marital положение:

Студент 2

-Name: Jane Doe

-ID: JD0192

-Date рождения: 13/12/99

-Gender: женщина

-Марифальное положение: женат

Это то, что я вижу в текстовом файле впоследствии.

Джон Смит \ 00 \ 00 \ 00 \ 00 \ 00 \ 00 \ A0 @ \ 00JS3019 \ 00 \ 00 \ C0 \ F414/10/90 \ 00 \ 00male \ 00 \ 00 \ 00single \ 00 \ 00 \ EDJane Doe \ 00h \ 00 \ 00 \ 00 \ 00 \ 00 \ 00 \ A0 @ \ 00JD0192 \ 00 \ 00 \ C0 \ F413/12/99 \ 00 \ 00female \ 00married \ 00 \ ED

Это нормально или что-то не так в моем коде?

+0

Вы записываете строки фиксированной ширины в файл, поэтому вы заставляют их дополнять какой-то мусор, если фактические данные короче. –

+0

«Странные» персонажи - это мусор. Есть ли лучший способ написать строки в файл? – Saiyan

+0

@phantom 'fprintf' подобен' printf', но записывается в файл. – zstewart

ответ

1

Проблема, которую вы видите, является результатом записи всего массива в файл, а не только частей, содержащих данные. Вы можете:

  1. Использование fprintf для печати строк данных в файл, а не с помощью write:

    FILE *f = fdopen(fd, "w"); 
    fprintf(f, "%s", name); 
    
  2. Изменение значения длины вы передаете write включать только использованную данные:

    write(fd, &name, strlen(name)); 
    
+0

Я использовал strlen () в записи. Данные сохраняются правильно для первого ученика, но для второго ученика есть символы мусора: John SmithJS123414/02/90malesingleJane DoeJD541214/03/99femalemarried \ 00 \ 00 \ 00 \ 00 \ A0 @ \ 00JD0192 \ 00 \ 00 \ C0 \ F413/12/99 \ 00 \ 00female \ 00married \ 00 \ ED – Saiyan

+0

Эти оба выглядят хорошо, просто похоже, что вы не обрезали файл перед записью. –

+0

Кроме того, мне нужно прочитать данные из файла и затем отображать его на экране.Поэтому я использовал строки фиксированной длины.Используя strlen здесь, будет невозможно отобразить разные данные на экране. – Saiyan

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