1

这是我的第一个 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);
} 
4

1 回答 1

1
if (fd=open(miArch,O_RDWR|O_CREAT,0777)<0){

<的优先级高于=。请参阅运算符优先级表

看来你的意思

if ((fd = open(miArch,O_RDWR|O_CREAT,0777)) < 0) {

或者当对优先级有疑问时,可能其他阅读您的代码的人也可能如此,所以只需添加更多括号以使含义更明显。

于 2020-06-01T22:18:08.817 回答