这是我的第一个 StackOverflow 问题,所以请对我温柔一点。基本上,我正在编写一个非常简单的 C 程序来编写然后将可变长度记录读取到文件中,而不使用这些练习中常用的 FILE* 结构。相反,我仅限于使用文件描述符及其读写命令。现在,在我因敢于询问家庭作业而受到抨击之前,让我先说我已经为此烦恼了好几天,而我的老师几乎没有提供任何帮助。我已经广泛地解决了这个问题,所以这是我最后的手段。缓冲区正确保存了信息,因为我已将其内容打印到屏幕上以确保,并且我已经以读写模式打开了文件,所以我不确定为什么会收到“错误的文件描述符” 当我在写调用后检查文件描述符状态时。我也尝试过以纯写模式打开文件,但这并没有成功。我可以看到正在创建文件,但其中没有写入任何内容。有人可以指出我正确的方向吗?提前致谢...
代码片段如下。粗体字是我似乎遇到问题的地方:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#define DELIM_STR "|"
#define DELIM_CHR '|'
#define fld_to_recbuff(rb,fld) strcat(rb,fld); strcat(rb, DELIM_STR)
short get_rec (int fd, char recbuff[]){
short rec_lgth;
if (read(fd,&rec_lgth,2)==0){
return (0);
}
rec_lgth=read(fd,recbuff,rec_lgth);
return rec_lgth;
}
short get_fld(char field[], char recbuff[],short scan_pos, short rec_lgth){
short fpos=0;
if (scan_pos==rec_lgth){
return 0;
}
while (scan_pos<rec_lgth && (field[fpos++]=recbuff[scan_pos++])!=DELIM_CHR);
if (field[fpos-1]==DELIM_CHR){
field[--fpos]='\0';
}
else{
field[fpos]='\0';
}
return (scan_pos);
}
char *prompt[]={
"Inserte el apellido -- o Enter para salir: ",
" Primer Nombre: ",
"Direccion: ",
"Ciudad: ",
"Estado: ",
"Codigo Postal: ",
""
};
int main() {
char miArch[15]= "file";
int fd;
// Variables to write to the file
char response [50];
int i;
short rec_lgth;
char recbuff[512];
char field[512];
gets (miArch);
if (fd=open(miArch,O_RDWR|O_CREAT,0777)<0){
printf("There was a problem opening the file!");
perror("Inside Main: ");
exit(1);
}
printf("\n\n%s", prompt[0]);
gets(response);
while (strlen(response)>0){
recbuff[0]= '\0';
fld_to_recbuff(recbuff,response);
for(i=1;*prompt[i]!='\0';i++){
printf("%s", prompt[i]);
gets(response);
fld_to_recbuff(recbuff, response);
}
printf("%s",recbuff);
rec_lgth=strlen(recbuff);
int s = write(fd,&rec_lgth,sizeof(rec_lgth));
if (s<0){
printf("Write failed!");
perror("Inside Write Function: ");
}
int status= write(fd,&recbuff,rec_lgth);
if (status<0){
printf("Write failed!");
perror("Inside the Second Write Call: ");
}
printf("\n\n%s", prompt[0]);
gets(response);
}
memset(recbuff,'\0',sizeof(recbuff));
close(fd);
exit(0);
}