Функция записи в C не работает из-за неправильного описания файла

Это мой первый вопрос о Stackru, так что будьте осторожны со мной. По сути, я пишу очень простую программу на 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);
} 

1 ответ

Решение
if (fd=open(miArch,O_RDWR|O_CREAT,0777)<0){

< имеет более высокий приоритет, чем =. См. Таблицу приоритета операторов.

Кажется, вы имели в виду

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

Или, если вы сомневаетесь в приоритете, вероятно, другие люди, читающие ваш код, тоже, поэтому просто добавьте больше круглых скобок, чтобы сделать смысл более очевидным.

Другие вопросы по тегам