|
Mostrar Mensajes
|
Páginas: [1]
|
1
|
Programación / Programación C/C++ / Como utilizar Struct stat
|
en: 6 Mayo 2018, 12:19 pm
|
Hola tengo este programa y quiero que cuando acabe devuelva información sobre el archivo, y para ello he usado struct stat pero me da error segmentación fault: 11. Alguien podría decirme como solucionarlo?
#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 <sys/types.h> #include <sys/stat.h> #include <unistd.h>
#define BUFFER_TAMAINA 512
int main(int argc, const char * argv[]) { int a; int f,k; char buff[BUFFER_TAMAINA]; FILE *f1;
struct stat *stat1;
if (argc==3) {
if (strcmp(argv[2],"0")!=0 && atoi(argv[2])==0) { write(1, "Arazoa, posizioa ez da zenbaki bat\n", 36); exit(1); }
f1=fopen(argv[1], "r+");
if(errno==ENOENT) { write(1, "Fitxategia ez da exititzen\n", 28); exit(1); } while(fgetc(f1)!=EOF){k++;} fclose(f1);
if((atoi(argv[2]))>k) { write(1,"Posizio altuegia ezarri da\n",28); exit(1); } if(atoi(argv[2])<0){ write(1, "Arazoa, posizioa negatiboa da\n", 31); exit(1); }
f = open(argv[1], O_WRONLY,00777);
if(errno==ENOENT){ write(1, "Fitxategia ez da exititzen\n", 28); exit(1); }
lseek(f, atoi(argv[2]), SEEK_SET);
while ((a=read(0,buff,BUFFER_TAMAINA))>0) { if(stat(argv[1],&*stat1) != NULL) { 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); } }
close(f); } else { write(1,"Erabilera: ./idatzi_fitx [fitxategia] [posizioa]\n",50); } }
|
|
|
2
|
Programación / Programación C/C++ / Re: Forma canonica
|
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); } }
|
|
|
4
|
Programación / Programación C/C++ / Forma canonica
|
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.
|
|
|
|
|
|
|