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 - rir3760

#841
Cita de: VbStructure en 22 Abril 2013, 05:09 AM¿Qué debo hacer?, la verdad, no sé qué es un puntero o un arreglo, lo de los bucle los voy a buscar.
Los pasos en lo general son, en pseudocodigo:

1) Declaras tres variables: array, auxiliar e indicador de posición.
2) Inicializas el indicador de posición a cero (numero de caracteres en la cadena).

Dentro de un bucle:
3) Imprimes las instrucciones.
4) Tratas de leer un carácter almacenando este en el auxiliar.
5) Si se pudo leer el carácter se agrega al array y se incrementa el indicador de posición.
6) Si no se puede leer se termina el bucle.

7) Se agrega el carácter delimitador '\0' a la cadena.
8) Se imprime la cadena.

Si apenas empiezas con el lenguaje C lo primero a conseguir es un buen curso o libro, utiliza el motor de búsqueda de los foros para encontrar recomendaciones.

Un saludo
#842
Cita de: NathanD en 22 Abril 2013, 11:23 AMEsos elementos se insertan sin problema en la lista, pero cuando lo inserto manualmente, por el teclado por ejemplo, no se añade a la lista (o si se añade, no se visualiza). A ver si me podéis ayudar.
En lo general ese fragmento no tiene problemas salvo dos detalles: falta de consistencia (hay que verificar el valor de retorno de malloc en todas sus llamadas) y el problema con la función "mostrarLista" si se trata de imprimir una lista vacía.

Mejor publica el código fuente completo.

Cita de: NathanD en 22 Abril 2013, 11:23 AMPD: aprovecho para preguntar una duda que me ha surgido, cuando se llama a la función de añadir elementos, ¿no habría que liberar con free() el espacio reservado para el nodo que se usa en la función?
No porque estarías liberando la memoria del nodo recién agregado.

Un saludo
#843
Cita de: acoevil en 20 Abril 2013, 21:11 PM
La pregunta mía es, como puedo hacer para que la siguiente función [...] Me reciba cualquier tipo de estructura, por ejemplo la anterior solo me recibe una estructura de proveedores, es posible que pueda usar esta funcion para pasar otras estructuras por ejemplo struct Clientes etc?
Es posible utilizando plantillas, en el tutorial de C plus plus se describe en la pagina (en ingles) Templates.

Pero en mi opinión es mejor que primero obtengas un buen manejo del lenguaje y su biblioteca estándar antes de meterte en ese tema.

Un saludo
#844
Cita de: Luchoz95 en 21 Abril 2013, 07:53 AMPorque utilizando esto :
while (fgets(cadena, MAX_CHARS, miarchivo) != NULL)
   fputs(cadena, stdout);


no se imprime el \n ?
Para explicar esto lo mejor es dividirlo en dos partes, el contenido del archivo y como opera la función feof.

1) En C un archivo de texto (mas bien un stream en modo texto) consiste de cero o mas lineas seguidas de ... nada. Por ejemplo:
Nombre1          Apellido1          Telefono1\n
Nombre2          Apellido2          Telefono2\n       
(nada)

El archivo se procesa carácter por carácter o (como es tu caso) por linea. Eventualmente se procesan todos los caracteres y, al no haber nada mas, se activa el estado de fin de archivo o eof.

2) El porque la ultima linea se procesa dos veces se debe al uso de feof, una explicación en detalle se encuentra en el tema Re: exec y sus derivadas.

Un saludo
#845
En esa función no puedes retornar -1 ya que ella no retorna un valor (indicado mediante su tipo de retorno: void). Cambia la sentencia de retorno a:
if (miarchivo == NULL)
   return;


Y no necesitas utilizar la función feof (salvo ciertas excepciones es mejor evitar su uso) en su lugar se puede utilizar el valor de retorno de la función utilizada. En tu caso cambia esta parte:
fgets(cadena, MAX_CHARS, miarchivo);
while (!feof(miarchivo)){
   fputs(cadena,stdout);
   fgets(cadena,MAX_CHARS,miarchivo);
}

Por esta:
while (fgets(cadena, MAX_CHARS, miarchivo) != NULL)
   fputs(cadena, stdout);


Un saludo
#846
Cita de: franfis en 17 Abril 2013, 15:09 PM
La solución era poner ;

letras.close();
fstream letras2("Letras.txt", ios::in|ios::out);

después del primer for  ;D
El problema con el fragmento que publicas es tratar de leer 2001 caracteres sin importar cuantos realmente hay en el archivo. Si contiene menos la función get eventualmente falla activando la bandera de fin de archivo y eso causa que, a partir de ese punto, todas las llamadas a seekg fallen.

Por eso el segundo bucle no funciona correctamente.

Para solucionarlo se debe desactivar esa bandera. Una forma algo extrema es mediante la operación que mencionas: cerrar el archivo y abrirlo de nuevo.

Un saludo
#847
Programación C/C++ / Re: [C] Error Caracteres
20 Abril 2013, 16:26 PM
Cita de: MeCraniDOS en 19 Abril 2013, 22:17 PMLo que hay en el comentario, entre /* */ no me da ningún problema, pero cuando abro un archivo si [...]

PD: Es una mezla de C y C++  :silbar:
Como ya te comentaron no es una buena idea mezclar C y C++, mejor hacerlo todo en este ultimo. Para ello puedes utilizar los operadores >> y <<, también se debe utilizar noskipws para procesar todo el contenido del archivo de entrada incluyendo el espacio blanco.

Un programa de ejemplo:
Código (cpp) [Seleccionar]
#include <iostream>
using std::noskipws;
using std::cin;
using std::cout;

#include <fstream>
using std::ifstream;
using std::ofstream;

#include <string>
using std::string;

#include <cctype>
using std::isspace;

int main()
{
   string nom_entrada;
   cout << "Nombre del archivo de entrada: ";
   getline(cin, nom_entrada);
   
   ifstream entrada(nom_entrada.c_str());
   noskipws(entrada);
   
   string nom_salida = nom_entrada + "_Char.txt";
   ofstream salida(nom_salida.c_str());
   
   for (unsigned char ch; entrada >> ch; salida << ch)
      if (!isspace(ch))
         ch++;
   
   entrada.close();
   salida.close();
   
   return 0;
}


Un saludo
#848
Programación C/C++ / Re: Ayuda con fprintf
20 Abril 2013, 06:24 AM
Cita de: Luchoz95 en 20 Abril 2013, 03:35 AMeh probado con lo que me pasaste pero tampoco funciono
El problema al solo comentar "no funciona" es que no hay forma de corregir el código fuente (el que sea).

Cita de: Luchoz95 en 20 Abril 2013, 03:35 AMpero ya encontre el error , ahora tengo que solucionarlo ... el error esta en esta linea ...
fgets(nPersona.nombre,50,stdin);
Con ello los campos nombre y apellido almacenaran el avance de linea como ultimo carácter, como ya te comente ese es el problema.

Un programa donde se muestra como eliminar el avance de linea e imprimir con formato:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_CHARS  256

struct reg {
   char nombre[MAX_CHARS];
   char apellido[MAX_CHARS];
   long telefono;
};

int main(void)
{
   struct reg nPersona;
   char *p;
   
   puts("Nombre:");
   fgets(nPersona.nombre, MAX_CHARS, stdin);
   p = strchr(nPersona.nombre, '\n');
   if (p != NULL)
      *p = '\0';

   puts("Apellido:");
   fgets(nPersona.apellido, MAX_CHARS, stdin);
   p = strchr(nPersona.apellido, '\n');
   if (p != NULL)
      *p = '\0';
   
   nPersona.telefono = 123456789;
   
   fprintf(
      stdout, "%-30s%-30s%-18ld\n",
      nPersona.nombre, nPersona.apellido, nPersona.telefono
   );
   
   return EXIT_SUCCESS;
}


Un saludo
#849
Programación C/C++ / Re: Ayuda con fprintf
20 Abril 2013, 02:48 AM
Cita de: Luchoz95 en 19 Abril 2013, 22:01 PMsigo con el mismo problema , se hace un salto de linea aunque le agrege esto ..
fprintf(miarchivo,"%-50s%-50s%-50d",nPersona.nombre,nPersona.apellido,nPersona.telefono);
La razón del avance de linea no es la llamada a función sino alguna de las cadenas. Lo mejor aquí es, cuando obtengas las cadenas, eliminar el avance de linea.

Si no es posible y alguna de ellas puede contener el mentado carácter se puede verificar y de ser necesario eliminarlo. Una opción es mediante la función strchr (prototipo en <string.h>), mas o menos así:
#include <string.h>

/* ... */

char *p;

/* ... */

p = strchr(nPersona.nombre, '\n');
if (p != NULL)
   *p = '\0';

p = strchr(nPersona.apellido, '\n');
if (p != NULL)
   *p = '\0';

fprintf(
   miarchivo, "%-50s%-50s%-50d",
   nPersona.nombre, nPersona.apellido, nPersona.telefono
);


Un saludo
#850
Cita de: Lotux5 en 19 Abril 2013, 21:33 PMme equivoque al copiarlo, "n = NCasillas();" pero aun asi tampoco me funciona.
Con solo eso es difícil ayudarte. Mejor indica porque no te funciona y publica un programa de ejemplo donde se manifieste el problema.

Un saludo