Функция записи в 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) {
Или, если вы сомневаетесь в приоритете, вероятно, другие люди, читающие ваш код, тоже, поэтому просто добавьте больше круглых скобок, чтобы сделать смысл более очевидным.