来自先前 scanf 的输入附加到另一个 scanf
Input from previous scanf appends to another scanf
程序要求用户输入 2 个学生的姓名、ID 等,将数据写入文件并从文件中读回数据。
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
int main(){
int fd, i = 0;
char name[20], id[10], dob[10], gender[7], status[10];
fd = open("file.dat", O_WRONLY|O_CREAT, S_IRWXU); //open file.dat for writing; if it does not exist, create it
for (i = 0; i < 2; i++){
//get input from user
printf("\nFor student %d\n", (i + 1));
printf("Enter name: ");
scanf("%[^\n]%*c", name); //%[^\n]%*c - read everything up to (excluding) new line character
printf("Enter ID: ");
scanf("%[^\n]%*c", id);
printf("Enter date of birth: ");
scanf("%[^\n]%*c", dob);
printf("Enter gender: ");
scanf("%[^\n]%*c", gender);
printf("Enter marital status: ");
scanf("%[^\n]%*c", status);
//write current student to file
write(fd, name, 20);
write(fd, id, 10);
write(fd, dob, 10);
write(fd, gender, 7);
write(fd, status, 10);
}
close(fd);
//display data from file
char buf[20];
fd = open("file.dat", O_RDONLY); //open file for reading
for (i = 0; i < 2; i++){
printf("\nFor student %d\n", (i + 1));
read(fd, buf, 20); //read name
printf("Name: %s\n", buf);
read(fd, buf, 10); //read id
printf("ID: %s\n", buf);
read(fd, buf, 10); //read date of birth
printf("Date of birth: %s\n", buf);
read(fd, buf, 7); //read gender
printf("Gender: %s\n", buf);
read(fd, buf, 10); //read marital status
printf("Marital status: %s\n", buf);
}
}
输入部分:
学生 1
输入姓名:玛丽·简·史密斯
输入编号:1
输入出生日期:1990 年 9 月 9 日
输入性别:女
输入婚姻状况:单身
学生 2
输入姓名:John Doe Paul
输入编号:2
输入出生日期:1993 年 8 月 8 日
输入性别:男
输入婚姻状况:已婚
显示部分:
学生 1
姓名:玛丽·简·史密斯
编号:1
出生日期:1990 年 9 月 9 日史密斯
性别:女
婚姻状况:单身
学生 2
姓名:John Doe Paul
编号:2
出生日期:08/08/1993aul
性别:男
婚姻状况:已婚
姓名的某些部分被添加到出生日期中。请问这是为什么,我该如何解决?
我读到 scanf 不可靠,但我需要在程序中使用 scanf。
问题不在scanf。问题出在您重新读取文件时的缓冲区处理中。当您读取文件时,您会在缓冲区 "buf" 中重复读取它,这不会以任何方式重置。因此,当您从文件中读取 10 个字符时,之前从名称中插入的 20 个字符仍在缓冲区中,因此会显示出来。您需要正确终止字符串(使用'\0')或在使用缓冲区时将缓冲区设置为全零,以确保不会 "old content" 返回。
程序要求用户输入 2 个学生的姓名、ID 等,将数据写入文件并从文件中读回数据。
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
int main(){
int fd, i = 0;
char name[20], id[10], dob[10], gender[7], status[10];
fd = open("file.dat", O_WRONLY|O_CREAT, S_IRWXU); //open file.dat for writing; if it does not exist, create it
for (i = 0; i < 2; i++){
//get input from user
printf("\nFor student %d\n", (i + 1));
printf("Enter name: ");
scanf("%[^\n]%*c", name); //%[^\n]%*c - read everything up to (excluding) new line character
printf("Enter ID: ");
scanf("%[^\n]%*c", id);
printf("Enter date of birth: ");
scanf("%[^\n]%*c", dob);
printf("Enter gender: ");
scanf("%[^\n]%*c", gender);
printf("Enter marital status: ");
scanf("%[^\n]%*c", status);
//write current student to file
write(fd, name, 20);
write(fd, id, 10);
write(fd, dob, 10);
write(fd, gender, 7);
write(fd, status, 10);
}
close(fd);
//display data from file
char buf[20];
fd = open("file.dat", O_RDONLY); //open file for reading
for (i = 0; i < 2; i++){
printf("\nFor student %d\n", (i + 1));
read(fd, buf, 20); //read name
printf("Name: %s\n", buf);
read(fd, buf, 10); //read id
printf("ID: %s\n", buf);
read(fd, buf, 10); //read date of birth
printf("Date of birth: %s\n", buf);
read(fd, buf, 7); //read gender
printf("Gender: %s\n", buf);
read(fd, buf, 10); //read marital status
printf("Marital status: %s\n", buf);
}
}
输入部分:
学生 1
输入姓名:玛丽·简·史密斯
输入编号:1
输入出生日期:1990 年 9 月 9 日
输入性别:女
输入婚姻状况:单身
学生 2
输入姓名:John Doe Paul
输入编号:2
输入出生日期:1993 年 8 月 8 日
输入性别:男
输入婚姻状况:已婚
显示部分:
学生 1
姓名:玛丽·简·史密斯
编号:1
出生日期:1990 年 9 月 9 日史密斯
性别:女
婚姻状况:单身
学生 2
姓名:John Doe Paul
编号:2
出生日期:08/08/1993aul
性别:男
婚姻状况:已婚
姓名的某些部分被添加到出生日期中。请问这是为什么,我该如何解决?
我读到 scanf 不可靠,但我需要在程序中使用 scanf。
问题不在scanf。问题出在您重新读取文件时的缓冲区处理中。当您读取文件时,您会在缓冲区 "buf" 中重复读取它,这不会以任何方式重置。因此,当您从文件中读取 10 个字符时,之前从名称中插入的 20 个字符仍在缓冲区中,因此会显示出来。您需要正确终止字符串(使用'\0')或在使用缓冲区时将缓冲区设置为全零,以确保不会 "old content" 返回。