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 - 最后捕获的数据项未写入文件的主要内容,如果未能解决你的问题,请参考以下文章

got未写入软件包数据

MySQL数据写入后显示NULL

如何向Word中写入数据,C#.net

5.ElasticSearch数据写入与删除

vhd怎么写入数据

node.js fs.createWriteStream 创建文件,但无法正确写入