【问题标题】:C - Last Captured Data Item Not Written To FileC - 最后捕获的数据项未写入文件
【发布时间】: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

标签: c file save writing


【解决方案1】:

首先,简要介绍一下 scanf 的工作原理:每当调用 scanf 时,它都会跳过前导空格,读取并存储字符,直到再次遇到空格(并且“空格”是一个空格字符)。一旦遇到空白字符,它就会返回并在再次调用时考虑剩余的字符。

现在,查看您的程序,我假设 ID 不包含任何空格,因此被 scanf 完全消耗,但是当您的程序准备好接受名称并说您输入“詹姆斯邦德”时。该字符串包含一个空格,因此 scanf 将“James”存储在 &aStudent.Name 中并返回。如前所述,下次调用 scanf 时会存储“Bond”,因此 &aStudent.Course 会存储 Bond。所以你的程序永远没有机会存储课程。结果就是这样。

【讨论】:

  • 是的,ID 没有空格。这解释了很多。我会像上面的评论建议的那样使用 fgets 吗?我以为那是为了从文件中读取?还有那条线会是什么样子?
  • 如上所述,只需在 fgets() 中使用 STDIN 作为文件流,它会像一个魅力一样工作,而且它也很安全。
  • 很抱歉再次打扰您。请问以fgets开头的代码行。我在这里看不到它了,我的程序也丢失了
猜你喜欢
  • 1970-01-01
  • 2015-07-21
  • 2011-02-28
  • 1970-01-01
  • 2016-03-07
  • 1970-01-01
  • 2020-11-12
  • 2017-10-14
  • 1970-01-01
相关资源
最近更新 更多