【问题标题】:Trying to write multiple lines to a file from a struct in C尝试从 C 中的结构将多行写入文件
【发布时间】:2020-08-22 04:28:49
【问题描述】:

我正在编写一个将学生数据输出到文本文件的小程序,我将这些数据存储在一个结构数组中,然后我尝试将这些数据输出到一个文本文件;但由于某种原因,它只输出最近输入的数据。

struct students
{
    char *familyName[20], *firstName[20];
    int enrolNum, mark1, mark2, mark3;
} st[1000];

FILE *fptr;
int studentNum;
int i = 0;
void main()
{
    double markOne, markTwo, markThree;

    markOne = st[i].mark1 * 0.30;
    markTwo = st[i].mark2 * 0.40;
    markThree = st[i].mark3 * 0.30;
    char *fName;
    do
    {
        ptr = fopen("student.txt", "a+");
        fprintf(fptr, "Family name \tFirst name \tenrolment number \tartefact mark 1 \tartefact mark 2 \tartefact mark 3 \n");
        fprintf(fptr,"%s \t\t%s \t\t%d \t\t\t%.1f%% \t\t%.1f%%  \t\t%.1f%% \n", st[i].familyName, st[i].firstName, st[i].enrolNum, markOne, markTwo, markThree);
        printf("\n%d\n%d", i, studentNum);
    } while( i < studentNum);
    fclose(fptr);
}

我似乎无法弄清楚为什么它只输出最新的数据点而不是全部。 关于它为什么会这样做的任何提示?

非常感谢 史蒂夫

【问题讨论】:

  • ptr = fopen("student.txt", "a+"); 真的应该在循环之外完成。如果你真的必须在循环内打开,那么也要在循环内关闭。
  • 为什么st 值从未真正设置?
  • char *familyName[20], *firstName[20]; 可能需要是char familyName[20], firstName[20];
  • St 值由用户在程序的不同部分输入。如果您想查看整个程序,我可以添加它。
  • 不,我不需要看。但最好在你的帖子中提及这些事情,以便人们知道它是故意遗漏的,不需要关注它(许多 SO 帖子的代码使用未初始化的变量)。

标签: c file struct


【解决方案1】:

在循环外写ptr = fopen("student.txt", "a+");。你会得到你想要的。

struct students
{
    char *familyName[20], *firstName[20];
    int enrolNum, mark1, mark2, mark3;
} st[1000];

FILE *fptr;
int studentNum;
int i = 0;
void main()
{
    double markOne, markTwo, markThree;

    markOne = st[i].mark1 * 0.30;
    markTwo = st[i].mark2 * 0.40;
    markThree = st[i].mark3 * 0.30;
    char *fName;
    ptr = fopen("student.txt", "a+");
    do
    {

        fprintf(fptr, "Family name \tFirst name \tenrolment number \tartefact mark 1 \tartefact mark 2 \tartefact mark 3 \n");
        fprintf(fptr,"%s \t\t%s \t\t%d \t\t\t%.1f%% \t\t%.1f%%  \t\t%.1f%% \n", st[i].familyName, st[i].firstName, st[i].enrolNum, markOne, markTwo, markThree);
        printf("\n%d\n%d", i, studentNum);
    } while( i < studentNum);
    fclose(fptr);
}

您的代码的问题是每次执行循环时都会调用ptr = fopen("student.txt", "a+");。并且文件ptr 再次打开。在之前的迭代中它没有被关闭。 如果在循环中添加fclose(fptr);,它也可以工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多