gpt4 book ai didi

c - 将结构体保存到 C 中的文件中

转载 作者:行者123 更新时间:2023-11-30 19:09:28 24 4
gpt4 key购买 nike

在我的作业中,我需要编写两个函数

int openFileFromConsole(FILE *fp)

它使用引用调用将空文件指针作为函数的输入。并更新指针以指向适当的 HDD 地址。重要提示:稍后,它会通过控制台要求用户提供名称,并要求提供文件打开类型:“w”、“r”、“a”并更新文件指针。如果成功则返回 1,如果失败则返回 0。

void saveStudentGradeInfoTofile(FILE *fp)

该函数获取学生信息并首先将其保存到学生数据类型(这是结构体,但使用 typedef 进行伪装),然后将其保存到文件。学生信息由寄存器通过控制台提供。这通过引用将文件指针作为输入,并使用 fprint 更新文件。

这个程序应该根据用户输入通过控制台打开一个文件,然后收集信息并将它们存储到一个结构中并将其保存到该文件中。我已经编写了这两个函数(我认为正确吗?)。但我是由于第一个是 int 类型函数,因此很难将它们实现到 main() 。任何帮助将不胜感激。

typedef struct student {
char name[50];
char id [20];
int score;
}student;

int openFileFromConsole(FILE *fp);
void saveStudentGradeInfoTofile(FILE *fp);

int main()
{
return 0;
}


int openFileFromConsole(FILE *fp){
char filePath[100],fileOpenType[10];
printf("Enter Path name: ");
scanf("%s", filePath);
printf("Enter file open type w, r or a: ");
scanf("%s", fileOpenType);

fp = fopen(filePath,fileOpenType);
if(fp != NULL) {
printf("File has been opened");
return 1;

}
else printf("File not found");
return 0;
}
void saveStudentGradeInfoTofile(FILE *fp){

int numOfStudent ;
student s[100];
printf ("Get the number of students :");
scanf("%d",&numOfStudent);

for(int i = 0; i < numOfStudent; i++) {


printf("\nEnter ID number:");

scanf(" %s",s[i].id);

printf("Enter name: ");
scanf("%s,",s[i].name);

printf("Enter score: ");
scanf("%d",&s[i].score);

fprintf(fp,"id : %s, Name: %s, score =%d\n",s[i].id,s[i].name,s[i].score);

printf("\n");
}
}

最佳答案

发布的代码有一些问题。

  1. 它不遵循公理:每行只有一个语句,并且每个语句(最多)一个变量声明。结果是代码更难以理解、调试和维护。
  2. 对系统函数的调用需要检查其返回值以确保操作成功。
  3. 要修改位于调用函数中的指针所指向的位置,该指针必须作为“指向指针的指针”进行传递。
  4. 调用 scanf() 中的任何一个时函数系列中,当使用“%s”输入转换说明符时,始终包含比输入缓冲区长度小 1 的 MAX CHARACTERS 修饰符,因此用户不会超出输入缓冲区。这种溢出会导致未定义的行为,并可能导致段错误事件。
  5. 使用“%s”输入转换说明符时,请在说明符之前插入一个空格以占用任何前导“空白”,就像任何换行序列一样。
  6. 退出程序时始终进行清理。不要将清理工作留给操作系统。
  7. 当使用永远不会小于 0 的数值时,最好使用 size_t而不是int
  8. 发布的代码永远不会从学生成绩信息文件中读取,因此永远不应使用 r 打开
  9. 调用 fopen() 时的“模式”始终是一个字符串,即使它只是一个字符,因此需要写为 "w"不仅仅是w
  10. 该代码包含大量“神奇”数字。 “神奇”数字是没有基础的数字。这样的数字使得理解、调试等变得比必要的困难得多。建议使用enum声明或#define语句为这些“神奇”数字赋予有意义的名称,然后在整个代码中使用这些有意义的名称。
  11. 为了便于阅读和理解,请一致缩进代码。每个左大括号“{”后缩进。每个右大括号“}”后不缩进。建议每个缩进级别使用 4 个空格,因为即使使用可变宽度字体,这也是可见的。
  12. 将“struct”定义与“typedef”结合起来是一种糟糕的编程习惯。分别对它们进行编码。
  13. 发布代码时,请包含所需的头文件语句,这样我们就不必猜测您的代码实际使用的内容。
  14. 为了便于阅读和理解,通过一个空行分隔代码块(for、if、else、while、do...while、switch、case、default)。用 2 或 3 个空行分隔函数(保持一致)。
  15. 虽然现代编译器将处理名称的重复,但由于现代编译器将结构名称与 typedef 名称保留在单独的命名空间中,但这是一种糟糕的编程实践,很容易导致困惑。建议保持名称的唯一性(尽管本答案并未遵循这一点。

以下是所需功能的可能实现:

#include <stdio.h>  // fopen(), fclose(), perror(), FILE
#include <stdlib.h> // exit(), EXIT_FAILURE

enum {
MAX_NAME_LEN =50,
MAX_ID_LEN =20,
MAX_PATH_LEN =100,
MAX_TYPE_LEN =10,
MAX_NUM_STUDENTS =100
};

struct student
{
char name[ MAX_NAME_LEN ];
char id [ MAX_ID_LEN ];
int score;
};

typedef struct student student;

int openFileFromConsole(FILE **fp);
void saveStudentGradeInfoTofile(FILE *fp);

int main( void )
{
FILE * fp = NULL;

int openStatus = openFileFromConsole(&fp);

if( 0 == openStatus )
{
saveStudentGradeInfoTofile( fp );
}

fclose( fp );
return 0;
} // end function: main


int openFileFromConsole(FILE **fp)
{
char filePath[ MAX_PATH_LEN ];
char fileOpenType;

printf("Enter Path name: ");
if( 1 != scanf("%100s", filePath) )
{
perror( "scanf for file path failed" );
exit( EXIT_FAILURE );
}

// implied else, scanf successful

printf("Enter file open type w, r or a: ");
if( 1 != scanf(" %c", &fileOpenType) )
{
perror( "scanf for file open type failed" );
exit( EXIT_FAILURE );
}

// implied else, scanf successful

char buffer[ MAX_TYPE_LEN ];
buffer[0] = '\"';
buffer[1] = fileOpenType;
buffer[2] = '\"';
buffer[3] = '\0';
*fp = fopen(filePath, buffer);
if( *fp )
{
return 1;
}

else
{
perror( "fopen failed" );
return 0;
}
} // end function: openFileFromConsole


void saveStudentGradeInfoTofile(FILE *fp)
{
size_t numOfStudent;
student s[ MAX_NUM_STUDENTS ];

printf ("Get the number of students :");
if( 1 != scanf("%lu",&numOfStudent) )
{
perror( "scanf for number of students failed:" );
fclose( fp );
exit( EXIT_FAILURE );
}

// implied else, scanf successful

for( size_t i = 0; i < numOfStudent; i++)
{
printf("\nEnter ID number:");
if( 1 != scanf(" %19s",s[i].id) )
{
perror( "scanf for student ID failed" );
fclose( fp );
exit( EXIT_FAILURE );
}

// implied else, scanf successful

printf("Enter name: ");
if( 1 != scanf(" %49s,",s[i].name) )
{
perror( "scanf for student ID failed" );
fclose( fp );
exit( EXIT_FAILURE );
}

// implied else, scanf successful

printf("Enter score: ");
if( 1 != scanf("%d",&s[i].score) )
{
perror( "scanf for student Score failed" );
fclose( fp );
exit( EXIT_FAILURE );
}

// implied else, scanf successful

fprintf(fp,"id : %s, Name: %s, score =%d\n",
s[i].id,
s[i].name,
s[i].score);

printf("\n");
} // end while
} // end function: saveStudentGradeInfoToFile

关于c - 将结构体保存到 C 中的文件中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43164609/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com