【发布时间】:2021-03-31 18:46:28
【问题描述】:
我正在尝试将结构的一组参数写入文件,然后在程序中读取它。该结构有一个int 类型变量和一个string 类型变量(此字符串以空格分隔)。我已经成功写入然后读取结构的整数部分,但是当我尝试对字符串执行相同操作时,程序崩溃。我认为这与我的fprintf 语句有关,并试图读取以空格分隔的字符串。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <locale.h>
int main(void) {
// creating a FILE variable
FILE *fptr;
// integer variable
int i = 0;
char n[50];
// character variable
struct cliente {
char nome[50];
int nif;
};
struct cliente client[0];
// open the file in write mode
fptr = fopen("student", "w");
if (fptr != NULL) {
printf("File created successfully!\n");
}
else {
printf("Failed to create the file.\n");
// exit status for OS that an error occured
return -1;
}
// get student detail
printf("Enter student name: ");
scanf(" %[^\t\n]c", client[1].nome);
printf("Enter student ID: ");
scanf("%d", &client[1].nif);
// write data in file
fprintf(fptr, "%d %s", client[1].nif, &client[1].nome);
// close connection
fclose(fptr);
// open file for reading
fptr = fopen("student", "r");
// display detail
printf("\Ficheiro:\n");
fscanf(fptr, "%d %s", &i, n);
printf("ID: %d\n", i);
printf(" %s", n);
// close connection
fclose(fptr);
return 0;
}
【问题讨论】:
-
struct cliente client[0];零长度数组在 C 中是不合法的。client[1]这引用了一个不存在的对象,之后都是undefined behavior。 -
OT: about:
printf("Failed to create the file.\n");错误信息应该输出到stderr,而不是stdout。强烈建议:perror( "fopen to write student failed" );这会输出到stderr,错误信息和文本原因系统都认为发生了错误。 -
关于:
scanf(" %[^\t\n]c", client[1].nome);你认为输入中white space之后的下一个字符是字母'c'`吗? -
关于:
fprintf(fptr, "%d %s", client[1].nif, &client[1].nome);这将输出学生 ID,一个空格,然后是 ????。建议删除client[1].nome之前的“&”,以便输出学生姓名。为什么要为每个学生输出一些可变长度?建议:fprintf(fptr, "%s", client[1] );将输出结构的一个实例,即包含学生数据的实例。 -
鉴于我之前的评论,这:
fscanf(fptr, "%d %s", &i, n); printf("ID: %d\n", i); printf(" %s", n);变为:fread( &client[1], sizeof( client[1] ), 1 );后跟:printf("ID: %d\n", client[1].nif.); printf(" %s", client[1].nome);当然,在调用fread()时,请务必检查返回值以确保操作正确成功。