【问题标题】:Cannot write/read string separated by coma into a file无法将用逗号分隔的字符串写入/读取到文件中
【发布时间】: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, &amp;client[1].nome); 这将输出学生 ID,一个空格,然后是 ????。建议删除client[1].nome 之前的“&”,以便输出学生姓名。为什么要为每个学生输出一些可变长度?建议:fprintf(fptr, "%s", client[1] ); 将输出结构的一个实例,即包含学生数据的实例。
  • 鉴于我之前的评论,这:fscanf(fptr, "%d %s", &amp;i, n); printf("ID: %d\n", i); printf(" %s", n); 变为:fread( &amp;client[1], sizeof( client[1] ), 1 ); 后跟:printf("ID: %d\n", client[1].nif.); printf(" %s", client[1].nome); 当然,在调用 fread() 时,请务必检查返回值以确保操作正确成功。

标签: c file scanf


【解决方案1】:

您声明了一个长度为零的数组 (struct cliente client[0]),但引用了数组中的第二个元素 (client[1])。这可能会导致崩溃。

【讨论】:

  • 感谢提醒,我有点老派,所以我最近才发现这个格式说明符。我已经更新了我的答案。我仍然不确定c 是否适合,但我会研究它。
  • 谢谢!这正是问题所在。刚刚正确声明了数组,代码按预期运行。问题是我试图在其他代码中实现这个功能,并提取这部分以尝试在更小的块上工作。问题是在其他代码中,它稍后由用户输入声明的数组。问题解决了!
猜你喜欢
  • 1970-01-01
  • 2012-08-27
  • 1970-01-01
  • 1970-01-01
  • 2018-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多