Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - Pol23

#1
Hola,

Tengo que hacer un ejercicio para poner en práctica procesos y semáforos en el que hay que hacer lo siguiente:
- un thread se encargará de leer el contenido de un fichero con funciones de lectura por bloques (binario) y tanto el nombre del fichero como el bloque como parámetros.
- el segundo, recibirá los datos del primer thread y lo enviará a un fichero de salida, que también hay que añadirlo como parámetro de la función que gestiona el thread.
- Es posible que haya que leer y escribir varias veces en los ficheros (debido al bloque de medida marcada como parámetro).


Cómo leer y escribir fichero binarios, pero utilizar threads y semáforos... y como estructurar el programa, aun menos...


Tengo que hacer lo mismo pero solo utilizando threads y por lo que he leído también MUTEX.

¿alguna ayuda?

Gracias!!
#2
cierto!! con -pthread funciona

gracias
#3
Hola,

Estoy intentando compilar un programa que utiliza threads y obtengo los siguientes errores:
thread2.c:(.text+0x87): referencia a `pthread_create' sin definir
thread2.c:(.text+0xa6): referencia a `pthread_create' sin definir
thread2.c:(.text+0xb7): referencia a `pthread_join' sin definir
thread2.c:(.text+0xc8): referencia a `pthread_join' sin definir
collect2: error: ld returned 1 exit status

Tengo puesta la librería #include <pthread.h> que creo que es la única que se necesita.

He leído otro mensaje del foro que preguntaban lo mismo:
https://foro.elhacker.net/programacion_cc/consulta_referencia_a_pthreadcreate_sin_definir-t389918.0.html

Y como respuesta ponía:
En efecto, tienes que linkar la librería.
Vete a Project->Build options->Linker settings.  En el panel de la izquierda pon pthread.


El problema es que no sé dónde puede estar esta opción, ya que estoy utilizando una máquina virtual (VirtualBox) con Ubuntu 18.04 instalado y únicamente podemos utilizar el editor de textos.

Gracias!!
#4
Programación C/C++ / Ejercicio PIPES
15 Octubre 2018, 16:08 PM
Hola,

Tengo que hacer 2 programas que copien el contenido de un fichero a otro utilizando pipes, en el primero solo pipes y en el segundo named pipes.

He estado leyendo sobre pipes y file descriptors, pero ciertamente no sé ni por dónde empezar.

Alguna idea?

Gracias
#5
Hola Mafus

He copiado tal cual tu programa y cuando lo ejecuto sale el menú de opciones, ninguna de las 3 opciones funciona correctamente, viendo el archivo copia.tx:

Opción 1
12345
abcde

Opción 2
54321
edcba

Opción 3
edcba
4321

Así que casi lo hace pero se come una línea (ya que mi fichero de entrada tiene 3 filas) y en todos los casos también se come caracteres, ya que las letras van hasta la J

Saludos
#6
He mejorado un poquito más el código para que me invierta las líneas, el problema es que no me lo crea bien, se come el primer carácter y tengo un salto de línea de más


El principio es igual, solo cambia "copiar"

int copiar(char* f_in,char* f_out)
{
FILE *fp_in,*fp_out;
char c, linea[MAX_CHARS];
int i, j;

if(!(fp_in=fopen(f_in,"r")) || !(fp_out=fopen(f_out,"w")))
{   
perror("Error en la apertura de ficheros, input2_2.txt no pudo copiarse");
exit(EXIT_FAILURE);
}

while((c=fgetc(fp_in))!=EOF && !ferror(fp_in) && !ferror(fp_out))
{
for (i = 0 ; i < 50; i++)
{
while (fgets(linea, MAX_CHARS, fp_in) != NULL)
{
for (j = 0; linea[j] != '\0' && linea[j] != '\n'; j++)
if (linea[j] == '\n')
linea[j] = '\0';
fprintf(fp_out,"%s", invertir(linea));
            }
          }
}

if(ferror(fp_in) || ferror(fp_out))
return 1;

fclose(fp_in);
fclose(fp_out);
return 0;
}
#7
He mejorado un poco el código para que me invierta las líneas, el problema es que solo consigo sacarlo por pantalla, cuando lo hago en un fichero, o hago bucles infinitos o no muestra lo que necesito
Además, me gustaría que el for del i fuera desde 0 hasta cualquier número y no hasta 50 (valor que he puesto por poner) ¿es esto posible?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_CHARS  4096

int copiar(char* f_in,char* f_out);
char *invertir(char linea[]);

int main()
{
FILE *infile; //para rw un fichero

if(!copiar("input2_2.txt","input2_2.txt.out"))
               printf("input2_2.txt se ha copiado con éxito\n");
else
printf("input2_2.txt no pudo copiarse\n");
return 0;
}

char *invertir(char linea[])
{
  int i;
  int j;
  int longitud;
  char aux;
 
  longitud = strlen(linea);
  for (i = 0, j = longitud - 1; i < j; i++, j--){
     aux = linea[i];
     linea[i] = linea[j];
     linea[j] = aux;
  }
 
  return linea;
}

int copiar(char* f_in,char* f_out)
{
FILE *fp_in,*fp_out;
char c, linea[MAX_CHARS];
int i, j;

if(!(fp_in=fopen(f_in,"rt")) || !(fp_out=fopen(f_out,"wt")))
{  
perror("Error en la apertura de ficheros, input2_2.txt no pudo copiarse");
exit(EXIT_FAILURE);
}

while((c=fgetc(fp_in))!=EOF && !ferror(fp_in) && !ferror(fp_out)){//EOF=end of file
for (i = 1 ; i < 50; i++){
         while (fgets(linea, MAX_CHARS, fp_in) != NULL){
              /* Buscamos y descartamos el avance de linea */
              for (j = 0; linea[j] != '\0' && linea[j] != '\n'; j++)
                 ;
              if (linea[j] == '\n')
                 linea[j] = '\0';

              printf("%s\n", invertir(linea));
           }
        }
}
if(ferror(fp_in) || ferror(fp_out))
return 1;

fclose(fp_in);
fclose(fp_out);
return 0;
}
#8
Hola,

Tengo un ejercicio en el que me piden copiar el contenido de un fichero a otro con 3 opciones:

a) copiar a en b tal cual
b) copiar a en b pero invirtiendo línea a línea, ejemplo:
   fichero a: 12345
                  abcde
   fichero b: 54321
                  edcba
c) copiar a en b pero invirtiendo todo el orden:
   fichero b: edcba
                  54321

¿podría poner un for después del while que fuera al revés (desde el final del fichero al principio) y lo fuera escribiendo?
O habría que hacer una función entre el main y el copiar que sea "invertir"?

Gracias
#9
Creo que sí, que es hacer la negación de lo que se está poniendo después, pero por qué no funciona:
(fp_in!=fopen(f_in,"rt"))
en vez de:
!(fp_in=fopen(f_in,"rt"))

Así que sólo me hace falta entender:

   while((c=fgetc(fp_in))!=EOF && !ferror(fp_in) && !ferror(fp_out))
      fputc(c,fp_out);

Que sé que es que se siga copiando mientras haya algo que copiar (o eso entiendo yo) pero no entiendo la construcción...
#10
Hola,

Tengo que hacer este programa y he copiado el código de 4rkn63l, el problema es que me hace al revés el if/else del main. ¿puede que fuera un error?

De todas formas, tengo algunas dudas sobre el código, ya sé que esto es de hace tiempo... pero espero que lo veáis y podáis contestarme:

1. ¿qué significa "!copy_file"? quiero decir la admiración. Es como si fuera una negación y por eso lo está haciendo al revés...

2.- No entiendo nada de la función int copy_file(....) podéis explicarmelo paso a paso, por favor?

Saludos