我正在尝试将结构以二进制形式写入文件,但我不断收到错误消息SIGSEGV 11。我不明白有什么问题。更准确地说,基本上,当我写这些行时,副作用就会出现。试图弄清楚 gdb 出了什么问题,但它没有帮助。
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include "student.h"
int read_student(student* st) {
return scanf("%s,%c,%c,%s,%s\n",
st->name, &st->sex, &st->class, st->university, st->job) == 5;
}
int main(int argc, char* argv[]){
student* st = malloc(sizeof(student)); student* prev = malloc(sizeof(student));
FILE* out = fopen(argv[1], "wb");
while (read_student(st)) {
printf("%s -> ", st->name);
if (strcmp(st->name, prev->name))
break;
*prev = *st;
fwrite(&st, sizeof(st), 1, out);
printf("success\n");
}
fclose(out);
return 0;
}
头文件student.h:
#ifndef __applicant_h__
#define __applicant_h__
typedef struct {
char name[50]; // фамилия и инициалы
char sex; // пол
char class; // буква класса
char university[50]; // университет
char job[30]; // место работы
} student;
#endif
我在终端中运行它是这样的:(./student.o data.bin) < data.txt
测试数据长这样(data.txt):
Artyom AC,m,A,Moscow Aviation Institute,Mobile TeleSystem
Maria SK,f,B,Moscow State University,Unemployees
我究竟做错了什么?
很多,废话太多。
好吧,不要忘记传入文件名并无论如何打开它(您不检查文件名是否已传入或是否已打开)。
但是,当使用 阅读时,
%s您阅读了一个不带逗号的单词,然后安全地退出循环 -scanf它返回的不是 5,而是 1。顺便说一句,谁阻止您至少显示一个调试条目并查看实际发生的情况?下一步 - 当您修复例如 like 时
scanf("%[^,],%c,%c,%[^,],%[^\n]",您正在尝试使用未初始化的内存prev。并不是说在这种情况下它非常可怕,而是非常糟糕。特别是在其他重要的情况下。你比较
strcmp(st->name, prev->name),因为有垃圾(inprev->name),你可以争辩说字符串不相等,这意味着函数strcmp将返回非零,然后你退出循环......但即使你也修复了这个问题,你最终还是将指针的值写入文件,而不是指针指向的值。你真的需要这个吗?
我想你想要
[可悲] 在那之后告诉我 - 你“这样”做什么?......顺便说一句,你不会在任何地方检查一个错误(好吧,我们只尝试过
scanf)......