Consulta fscanf leer nueva linea

Iniciado por casidus, 14 Febrero 2014, 11:32 AM

0 Miembros y 1 Visitante están viendo este tema.

casidus

Buenos dias.

me gustaria saber si me podeis decir como hacer esto.

tengo que hacer un programa que me lee de un fichero txt una matrices de longitud variable, por ejemplo:

1 2 1
1 1 
1   1

en esta matrices no hay 0 sino que se sustituyen por un salto de linea si estan al final o por un espacio si estan en medio.

yo hasta ahora lo que hacia era lo siguiente;

fscanf(files [a], "%[^\n]s", temp)

temp como su nombre dice en una variable temporal del tipo char [] lo suficientemente grande para que coja una linea.

la primera linea me la lee perfectamente, pero ahi se queda solo me lee la primera.

que hay que hacer para que me lea todas las lineas una por una ???

se que lo correcto seria hacer fscanf(files [a], "%d %d %d", temp)  pero como es variable la longitud, y los ceros son o espacios o saltos de linea no me funciona bien

gracias por todo

eferion

Estaría bien conocer el código que tienes alrededor de esta función... lo mismo el problema está en cómo has implementado el bucle que lee todas las líneas.

casidus

Cita de: eferion en 14 Febrero 2014, 11:39 AM
Estaría bien conocer el código que tienes alrededor de esta función... lo mismo el problema está en cómo has implementado el bucle que lee todas las líneas.

de momento no he echo el bucle mi primer problema es leerlo

pero seria algo asi

for (i = 0; i!=2; i++)
{
   while(hasta fin archivo i)
    {
      fscanf(files , "%[^\n]s", temp)
      array guardar numero linea leida
      }
}

seria algo asi.

si el bucle lo que hace es repetir fscanf(files [a], "%d %d %d", temp) me lo lee, pero entonces tengo el problema de los 0 que no son 0, por eso necesito algo que me lea linea por linea .

gracias por todo

casidus

ya lo he solucionado

solo habia que hacer fgetc(files [a]); despues de cada fscanf

ahora solo una consulta mas, tengo que hacer este proceso con dos threat, para que sirven los Threat??? creo que son treats, me dicen que use pipe();

Gracias por todo

eferion

Si tu tienes una aplicación monohilo (las que has realizado hasta ahora), y en un momento dado tienes que realizar un proceso pesado que lleve varios segundos, te habrás dado cuenta de que durante ese tiempo la aplicación no responde ante el usuario.

Este efecto se produce porque tu aplicación únicamente dispone de un thread o hilo de ejecución. Como sólo hay un hilo y este está ocupado con el proceso pesado no puede encargarse de interactuar con el usuario.

Ahora por ejemplo imagínate que modificas tu código de tal forma que el proceso pesado se ejecute en un segundo hilo... ahora la aplicación podrá interaccionar con el usuario sin problemas porque un hilo de ejecución estará liado con el proceso pesado mientras que otro segundo hilo que está libre podrá prestar atención a otras tareas, como por ejemplo al usuario.

Programar aplicaciones multihilo permite ofrecer una mejor experiencia al usuario, ya que evitas que la aplicación quede congelada, por ejemplo. Sin embargo, diseñar un entorno multihilo tiene sus complicaciones, ya que te puedes encontrar con situaciones inesperadas como condiciones de carrera o abrazos mortales ( busca en google para más información ).

casidus

Cita de: eferion en 14 Febrero 2014, 12:47 PM
Si tu tienes una aplicación monohilo (las que has realizado hasta ahora), y en un momento dado tienes que realizar un proceso pesado que lleve varios segundos, te habrás dado cuenta de que durante ese tiempo la aplicación no responde ante el usuario.

Este efecto se produce porque tu aplicación únicamente dispone de un thread o hilo de ejecución. Como sólo hay un hilo y este está ocupado con el proceso pesado no puede encargarse de interactuar con el usuario.

Ahora por ejemplo imagínate que modificas tu código de tal forma que el proceso pesado se ejecute en un segundo hilo... ahora la aplicación podrá interaccionar con el usuario sin problemas porque un hilo de ejecución estará liado con el proceso pesado mientras que otro segundo hilo que está libre podrá prestar atención a otras tareas, como por ejemplo al usuario.

Programar aplicaciones multihilo permite ofrecer una mejor experiencia al usuario, ya que evitas que la aplicación quede congelada, por ejemplo. Sin embargo, diseñar un entorno multihilo tiene sus complicaciones, ya que te puedes encontrar con situaciones inesperadas como condiciones de carrera o abrazos mortales ( busca en google para más información ).

ok, gracias.

entonces una consulta, pongamos que el while que lee, que lo hace dos archivos, por lo que hay que repetir el while dos veces, que tendria que hacer para que dos procesos lo ejecuten y asi ahorrar tiempo??????

gracias por todo

leosansan

#6
Cita de: casidus en 14 Febrero 2014, 11:32 AM

tengo que hacer un programa que me lee de un fichero txt una matrices de longitud variable, por ejemplo:

1 2 1
1 1  
1   1

...................................................................
yo hasta ahora lo que hacia era lo siguiente;

fscanf(files [a], "%[^\n]s", temp)

temp como su nombre dice en una variable temporal del tipo char [] lo suficientemente grande para que coja una linea.

la primera linea me la lee perfectamente, pero ahi se queda solo me lee la primera.
..........................................

Antes que nada cuando postees código elige las etiquetas GeSHi y toma la C++ y en medio de las etiquetas Code que aparecen "pegas" tu código. Al no hacerlo de esta manera parte del código no sale correcta, especialmente las matrices.

Creo que resulta más natural usar ;)

Código (cpp) [Seleccionar]
fgets(temp, 80, files[i])

¡¡¡¡ Saluditos! ..... !!!!




casidus

Cita de: leosansan en 14 Febrero 2014, 14:28 PM
Antes que nada cuando postees código elige las etiquetas GeSHi y toma la C++ y en medio de las etiquetas Code que aparecen "pegas" tu código. Al no hacerlo de esta manera parte del código no sale correcta, especialmente las matrices.

Creo que resulta más natural usar ;)

Código (cpp) [Seleccionar]
fgets(temp, 80, files[i])

¡¡¡¡ Saluditos! ..... !!!!






ok, por esa parte ya lo tengo solucionado, ahora me surge otro problema, en concreto 2 mas.

uno, tengo dos punteros dobles **A y **B ambos son int, y con malloc quiero convertirlos en arrays para guardar las matrices, tengo esta funcion.


int** createMatrix(int n, int m) {
    int i;
    int** mat = malloc(n * sizeof (int*));
    for (i = 0; i < n; i++) {
        mat[i] = malloc(m * sizeof (int));
    }
    return mat;
}


entiendo que para llamarla tengo qeu hacer esto  :

    A = createMatrix(An, Am);
    B = createMatrix(Bn, Bm);


An,Am,Bn,Bm  son la dimension de la matriz.

pero  con netbeans el el debugger veo que no me crea el array, por que puede ser?????


otra consulta es, como funciona el pipe(); ????

haber lo que quiero hacer son de momento dos cosas, 1 que ese pipe me cree dos procesos para leer las matrices, y que me creee otros dos procesos para escribir las matrices.


gracias por todo