GuillermoB
Novato

Mensajes: 2
|
 |
« : Noviembre 06, 2011, 07:22:36 » |
|
Hola, me he registrado en la USACO y estoy tratando de seguir su manual, ya que explica bastante bien los distintos tipos de programación, pero mi problema es que vengo de la OIE donde se usa la entrada y salida estandard, y aquà va todo por ficheros. ¿Alguien podrÃa darme un ejemplo de un programa (por ejemplo la suma de dos enteros) en c++ que use entradas y salidas por ficheros? Gracias.
|
|
|
|
|
En línea
|
|
|
|
|
HQH
|
 |
« Respuesta #1 : Noviembre 06, 2011, 08:53:29 » |
|
En C a secas puedes usar fscanf y fprintf para imprimir Algun ejemplo FILE fichero=fopen("gift1.in","r"); FILE ficheroSalida=fopen("gift1.in","w"); fscanf(fichero,"%d",&numero); fprintf(ficheroSalida,"El entero leido es %d",numero);
En C++ se podria asi #include <iostream> #include <fstream> #include <string> using namespace std;
int main () { string line; ifstream myfile ("example.txt"); if (myfile.is_open()) { while ( myfile.good() ) { getline (myfile,line); cout << line << endl; } myfile.close(); }
else cout << "Unable to open file";
return 0; }
Y aqui para escribir. int main () { ofstream myfile; myfile.open ("example.txt"); myfile << "Writing this to a file.\n"; myfile.close(); return 0; }
Espero te sean utiles, un saludo.
|
|
|
|
|
En línea
|
|
|
|
GuillermoB
Novato

Mensajes: 2
|
 |
« Respuesta #2 : Noviembre 07, 2011, 12:35:28 » |
|
Ok, muchas gracias, ya diré si he conseguido resolver algún problema.
|
|
|
|
|
En línea
|
|
|
|
piltrafukka
Novato

Mensajes: 33
|
 |
« Respuesta #3 : Noviembre 07, 2011, 08:30:08 » |
|
En el ejemplo de C te faltan los * de los punteros a FILE. Y como detalle menor que el fichero de salida normalmente tiene la extensión .out FILE *fichero=fopen("gift1.in","r"); FILE *ficheroSalida=fopen("gift1.out","w"); fscanf(fichero,"%d",&numero); fprintf(ficheroSalida,"El entero leido es %d",numero);
|
|
|
|
|
En línea
|
|
|
|
|
HQH
|
 |
« Respuesta #4 : Noviembre 09, 2011, 01:20:31 » |
|
Menudo despiste, gracias por el aviso!
|
|
|
|
|
En línea
|
|
|
|
jetemias
Novato

Mensajes: 5
|
 |
« Respuesta #5 : Marzo 29, 2012, 07:13:37 » |
|
Hola, hoy me he registrado en la web USACO y tengo el mismo problema que mi compañero. No he querido abrir un nuevo tema a pesar de que este lleva bastante tiempo "olvidado". Mi problema es con java, yo se recoger datos de un archivo desde la consola con la clase Scanner: java Programa < Datos.txt Pero el método de entrada aquà es diferente, utiliza otra clase que aún no conozco (pero creo que ese no es mi problema, ya que creo comprender como funciona está aunque sea la primera vez que la veo), mi problema radica en que me creo un archivo llamado programa.in, ¿pero dentro como aparecen los datos?, es decir, ¿para indicar los saltos de linea hay un caracter especifico?¿La entrada viene definida por espacios en blanco o saltos de lÃnea? 5 6 5 6 No consigo que mi programa "coja este archivo". ¿Este archivo donde lo he de poner, en la misma carpeta que el programa.java o el programa.class? EDIT: Otra pregunta, vengo del concurso Programa-me de la CAM, en el cual te decian una condición de salida, ¿aquà solo hay un caso cada vez que se ejecuta el programa? PD: solo he visto el test y el ride.
|
|
|
|
« Última modificación: Marzo 29, 2012, 07:29:36 por jetemias »
|
En línea
|
Aprendiendo...
|
|
|
|
HQH
|
 |
« Respuesta #6 : Marzo 30, 2012, 06:44:32 » |
|
Hola compañero, debes hacer un codigo similar al de leer la entrada estandard normal (como si leyeras por teclado, un fichero es igual).
Si tienes problemas postea el codigo en Java que no te lee el fichero.
Por lo demas, en la USACO generalmente solo lees una entrada y tienes una salida. PAra juzgar, el juez te lo prueba con varios ficheros de prueba y si todos son correctos, te lo da por valido.
Espero te haya servido de ayuda, un saludo!
|
|
|
|
|
En línea
|
|
|
|
jetemias
Novato

Mensajes: 5
|
 |
« Respuesta #7 : Marzo 30, 2012, 04:19:22 » |
|
El juez online me da error. Este es mi código (falta el algoritmo de busqueda el cual no veo necesario ponerlo): import java.io.*; import java.util.*;
class ride { static char abecedario[]={' ','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'}; public static void main (String [] args) throws IOException {
RandomAccessFile f = new RandomAccessFile ("ride.in", "r"); PrintWriter out = new PrintWriter( new BufferedWriter( new FileWriter("ride.out")));
String s = f.readLine(); StringTokenizer st = new StringTokenizer(s); String ovni = st.nextToken(); String grupo = st.nextToken(); int totOvni= Suma(ovni); int totGrupo= Suma(grupo); if (totOvni == totGrupo) System.out.println("GO"); else System.out.println("STAY");
System.out.close(); System.exit(0);
} public static int Suma(String cadena){ int total= 1; char[] Char = cadena.toCharArray(); for(int a=0; a<Char.length; a++) total*= Buscar(Char[a]); total%= 47; return total; } ¿Por qué me da error? ¿Me puede decir alguien donde he de crear el archivo.in para poder probarlo sin tener que recurrir al juez? Creo que archivo.in está en hexadecimal, por lo que deberÃa de escribir: 43 4f 4d 45 54 51 48 56 4e 47 41 54 Para indicar: COMETQ HVNGAT ¿Me lo podéis confirmar? Gracias de antemano.
|
|
|
|
« Última modificación: Marzo 30, 2012, 06:34:12 por jetemias »
|
En línea
|
Aprendiendo...
|
|
|
|
HQH
|
 |
« Respuesta #8 : Marzo 30, 2012, 05:55:08 » |
|
El fichero .in debe estar en el mismo directorio donde tu ejecutable. Almenos asi es en C y C++ (nunca he enviado nada en Java en la Usaco) Para leer el fichero, puedes usar Scanner, por si te aclaras mas. Aqui dejo un ejemplo de uso. /*Esta clase lee el fichero de configuración*/
import java.io.FileReader; import java.io.IOException; import java.util.Scanner;
public class ReadFile { public static java.util.Hashtable read() throws IOException { //Creamos un FileReader especificando la ruta //en la que se encuentra nuestro archivo de configuracion FileReader file = new FileReader("mifichero.in");
//Creamos el Objeto Scanner a partir del FileReader creado Scanner scanner = new Scanner(file); java.util.Hashtable hashFile = new java.util.Hashtable(); //Creamos las variables donde almacenaremos el nombre //y el valor de cada variable de configuracion String name = "", value="";
//Este bucle nos va a permitir recorrer nuestro fichero //hasta el final while (scanner.hasNextLine()) { //Obtenemos la siguiente linea del fichero Scanner line = new Scanner(scanner.nextLine());
//Especificamos el separador introducido entre variable y //valor en nuestro archive de configuracion. //En este caso es un espacio en blanco pero si la //estructura de nuestro fichero fuera variable=valor //usarÃamos: line.useDelimiter("="); line.useDelimiter(" ");
//Si la linea encontrada no esta en blanco obtenemos nombre //de la variable, es decir, el texto encontrado hasta //el primer espacio en blanco (separador) if(line.hasNext()) name = line.next();
//Si la linea no empieza por el carácter '#' y por lo tanto //no es un comentario y ademas tiene un valor, lo obtenemos if(!name.startsWith("#") & line.hasNext()){ value = line.next();
//Añadimos en la tabla de hash el nombre como clave //y el valor como valor. //Ademas eliminamos los posibles espacios en blanco hashFile.put(name.trim(), value.trim()); }
//Cerramos la linea line.close(); }
//Cerramos scanner y fichero scanner.close(); file.close();
//Devolvemos la tabla de hash return hashFile; } }
|
|
|
|
|
En línea
|
|
|
|
|
HQH
|
 |
« Respuesta #9 : Marzo 30, 2012, 05:58:40 » |
|
Ah, perdon, un asunto. Tu la salida la haces con System.out.println , eso es la salida estandar y no vale. Lo tuyo es out a secas (sin el system  ) La salida deben ser caracteres ASCII normales (como en cualquier otro concurso de programacion) Deberas escribir un fichero. Te pongo otro ejemplo por si te aclaras mas import java.io.*;
public class EscribeFichero { public static void main(String[] args) { FileWriter fichero = null; PrintWriter pw = null; try { fichero = new FileWriter("c:/prueba.txt"); pw = new PrintWriter(fichero);
for (int i = 0; i < 10; i++) pw.println("Linea " + i);
} catch (Exception e) { e.printStackTrace(); } finally { try { // Nuevamente aprovechamos el finally para // asegurarnos que se cierra el fichero. if (null != fichero) fichero.close(); } catch (Exception e2) { e2.printStackTrace(); } } } }
|
|
|
|
|
En línea
|
|
|
|
jetemias
Novato

Mensajes: 5
|
 |
« Respuesta #10 : Marzo 30, 2012, 06:32:41 » |
|
Lo probare con la clase Scanner, ya que es con está con la que siempre he trabajado.
Gracias por recordarme que la salida es sin el System, (la constumbre me hace ponerlo).
EDIT: En tu primer mensaje con el código, pones #, ¿los ficheros.in del juez de USACO llevan comentarios? en caso de que esto sea cierto, ¿los indica como me has dicho, es decir, con la #?
EDIT2: ¿A que te refieres con la tabla "de hash"?
|
|
|
|
« Última modificación: Marzo 30, 2012, 06:45:16 por jetemias »
|
En línea
|
Aprendiendo...
|
|
|
jetemias
Novato

Mensajes: 5
|
 |
« Respuesta #11 : Marzo 30, 2012, 07:43:26 » |
|
Ya he conseguido que me funcione, me he basado en tu código HQH para que me reconozca el archivo y luego recogo los datos como siempre he hecho, con Scanner. Pongo un ejemplo por si en un fúturo a algún otro usuario le pasa el mismo error: import java.io.*; import java.util.*;
public class AprendiendoALeer { public static void main (String [] args) throws IOException { FileReader file = new FileReader("C:/archivo.in"); Scanner teclado= new Scanner(file); PrintWriter out = new PrintWriter( new BufferedWriter( new FileWriter("C:/archivo.out")));
String var1= teclado.nextLine(); String var2= teclado.nextLine(); out.println(var1); out.println(var2); out.close(); System.exit(0); } } Este es archivo.in: Hola Don Pepito. Hola Don José. |
Y asà queda el archivo.out despues de la ejecucción del programa: Hola Don Pepito. Hola Don José. |
USACO me ha dado OK para ride, ya puedo seguir con otros problemas. De nuevo gracias HQH por toda la ayuda que me has brindado. Saludos
|
|
|
|
|
En línea
|
Aprendiendo...
|
|
|
|
HQH
|
 |
« Respuesta #12 : Marzo 30, 2012, 09:51:22 » |
|
El ejemplo de uso de ficheros, lo he cogido de por ahi (Sabia como se usaban, pero no tenia nada de la usaco en java). Me alegro de haberte ayudado, ahora a darle al coco con los problemas de la Usaco, que no son moco de pavo 
|
|
|
|
|
En línea
|
|
|
|
|