Título: Forma canonica Publicado por: txiki481 en 23 Abril 2018, 21:40 pm Buenas, estoy haciendo un programa que dandole una posición y un fichero, escribe lo que pongas en la terminal y lo escribe en la posición introducida.
#include <unistd.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <string.h> #include <stdio.h> #include <stdlib.h> #include <errno.h> #define BUFFER_TAMAINA 512 main(int argc, const char * argv[]) { int a; int f,k; char buff[BUFFER_TAMAINA]; FILE *f1; if (argc==3) { if (strcmp(argv[2],"0")!=0 && atoi(argv[2])==0) { write(1, "error, la posicion no es un numero\n", 36); exit(1); } f1=fopen(argv[1], "r+"); if(errno==ENOENT) { write(1, "el fichero no existe\n", 28); exit(1); } while(fgetc(f1)!=EOF){k++;} fclose(f1); if((atoi(argv[2]))>k) { write(1,"la position es demasiado alta\n",28); exit(1); } if(atoi(argv[2])<0){ write(1, "la position es negativa\n", 31); exit(1); } f = open(argv[1], O_WRONLY,00777); if(errno==ENOENT){ write(1, "el fichero no existe\n", 28); exit(1); } lseek(f, atoi(argv[2]), SEEK_SET); while ((a=read(0,buff,BUFFER_TAMAINA))>0) { write(f,buff,a); } close(f); } else { write(1,"Erabilera: ./idatzi_fitx [fichero] [posicion]\n",50); } } El problema es que en la terminal hay que darle al enter para que lo escriba, es decir esta hecho de manera canónica, y coge tambien el intro como todo lo que queremos escribir. Como podría hacer para que no tuviera en cuenta el enter? Y como podría hacerlo de forma no canónica? Es decir, que todo lo que vaya escribiendo en la terminal se vaya escribiendo sin necesidad de darle al enter. Título: Re: Forma canonica Publicado por: MAFUS en 24 Abril 2018, 11:00 am Eso depende del terminal, no hay una forma estándar para todo el mundo. Si tienes *nix se hace de una forma, en Windows de otra...
Título: Re: Forma canonica Publicado por: txiki481 en 24 Abril 2018, 11:45 am de la forma de unix como seria
Título: Re: Forma canonica Publicado por: MAFUS en 24 Abril 2018, 17:15 pm Repasa este par de stackoverflow. Lo explica.
https://stackoverflow.com/questions/7469139/what-is-equivalent-to-getch-getche-in-linux Título: Re: Forma canonica Publicado por: txiki481 en 25 Abril 2018, 18:39 pm Solo me coge un caracter, le doy a cualquier letra y se acaba el programa guardando la letra en la posición introducida. Como hago para escribir todo lo que quiera?
#include <unistd.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <string.h> #include <stdio.h> #include <stdlib.h> #include <errno.h> #include <termios.h> #define BUFFER_TAMAINA 512 void SetTermNoCanon( struct termios *SavedTM) { struct termios tm; tcgetattr(0, &tm); tcgetattr(0, SavedTM); tm.c_lflag &= ~(ICANON|ECHO); tm.c_cc[VMIN]= 1; tm.c_cc[VTIME]= 0; tcsetattr(0, TCSANOW, &tm); } int main(int argc, const char * argv[]) { int a; int f,k; char buff[BUFFER_TAMAINA]; int p = atoi(buff); // FILE *f1; struct stat *stat1; struct termios saved_tm; if (argc==3) { if (strcmp(argv[2],"0")!=0 && atoi(argv[2])==0) { write(1, "error, la posicion no es un numero\n", 36); exit(1); } f1=fopen(argv[1], "r+"); if(errno==ENOENT) { write(1, "el fichero no existe\n", 28); exit(1); } while(fgetc(f1)!=EOF){k++;} fclose(f1); if((atoi(argv[2]))>k) { write(1,"la position es demasiado alta\n",28); exit(1); } if(atoi(argv[2])<0){ write(1, "la position es negativa\n", 31); exit(1); } f = open(argv[1], O_WRONLY,00777); if(errno==ENOENT){ write(1, "el fichero no existe\n", 28); exit(1); } lseek(f, atoi(argv[2]), SEEK_SET); SetTermNoCanon( &saved_tm ); while ((a=read(0,buff,BUFFER_TAMAINA))>0) { if(stat(argv[1], &*stat1) != NULL) { switch(p) { case 'q': tcsetattr(0, TCSANOW, &saved_tm); close(f); exit(0); case ' ': break; default: write(f,buff,a); printf("Información:\n",argv[1]); printf("---------------------------\n"); printf("Tamaño: \t \t %d bytes\n", stat1->st_size); printf("Links: \t%d\n", stat1->st_nlink); printf("inode: \t \t %d\n", stat1->st_ino); } } } tcsetattr(0, TCSANOW, &saved_tm); close(f); exit(0); } else { write(1,"Erabilera: ./idatzi_fitx [fichero] [posicion]\n",50); } } Título: Re: Forma canonica Publicado por: MAFUS en 25 Abril 2018, 22:01 pm No tengo linux para probar el código, pero debería ser una cosa así:
Código
|