C - 最后捕获的数据项未写入文件
Posted
技术标签:
【中文标题】C - 最后捕获的数据项未写入文件【英文标题】:C - Last Captured Data Item Not Written To File 【发布时间】:2018-10-14 10:37:39 【问题描述】:我的程序应该为一个学生捕获三项数据并将它们写入一个文件; ID、姓名和课程。
名称和课程包含空格。 它运行,但是当我检查文件时,只写了 ID 和名称。是因为我捕获数据的方式吗?
我的代码:
#include <stdio.h>
#include <string.h>
struct StudentDetails
char ID[50];
char Name[50];
char Course[50];
aStudent;
void capture()
char ch;
printf("Enter ID: ");
scanf ("%s", &aStudent.ID);
printf("Enter Name: ");
scanf ("%s ", &aStudent.Name);
printf("Enter Course: ");
scanf ("%s ", &aStudent.Course);
ch = getchar();
void saveToFile()
FILE *studentDetails;
studentDetails = fopen("students.txt", "a");
fprintf(studentDetails,"%s\t%s\t%s\n",aStudent.ID, aStudent.Name,aStudent.Course);
fclose(studentDetails);
void main()
capture();
saveToFile();
【问题讨论】:
您可能希望提高编译器的警告级别(对于 GCC 传递-Wall -Wextra -pedantic
),阅读并理解编译期间发出的警告,然后修复代码直到不再给出警告.不要盲目抛弃警告(d)。
我在哪里放置这段代码 aStudent.ID[strcspn(aStudent.ID,"\n")]=0
【参考方案1】:
首先,简要介绍一下 scanf 的工作原理:每当调用 scanf 时,它都会跳过前导空格,读取并存储字符,直到再次遇到空格(并且“空格”是一个空格字符)。一旦遇到空白字符,它就会返回并在再次调用时考虑剩余的字符。
现在,查看您的程序,我假设 ID 不包含任何空格,因此被 scanf 完全消耗,但是当您的程序准备好接受名称并说您输入“詹姆斯邦德”时。该字符串包含一个空格,因此 scanf 将“James”存储在 &aStudent.Name 中并返回。如前所述,下次调用 scanf 时会存储“Bond”,因此 &aStudent.Course 会存储 Bond。所以你的程序永远没有机会存储课程。结果就是这样。
【讨论】:
是的,ID 没有空格。这解释了很多。我会像上面的评论建议的那样使用 fgets 吗?我以为那是为了从文件中读取?还有那条线会是什么样子? 如上所述,只需在 fgets() 中使用 STDIN 作为文件流,它会像一个魅力一样工作,而且它也很安全。 很抱歉再次打扰您。请问以fgets开头的代码行。我在这里看不到它了,我的程序也丢失了以上是关于C - 最后捕获的数据项未写入文件的主要内容,如果未能解决你的问题,请参考以下文章