Pascal/Turbo Pascal - ficheros texto

 
Vista:

ficheros texto

Publicado por PAULA (7 intervenciones) el 29/05/2019 23:23:15
hola buenas tengo que hacer este ejercicio:

Realizar un programa que abra un fichero de texto, cree una copia del mismo y añada al final de la copia una cadena de caracteres.

El programa deberá:
1. Solicitar el nombre del fichero de entrada, y abrirlo para lectura.
2. Solicitar el nombre del fichero destino, comprobar que es distinto del nombre del fichero de entrada, y si es así abrirlo para escritura.
3. Solicitar la línea a añadir al final del fichero.
4. Leer línea a línea el fichero de entrada: en cada iteración del bucle leerá una línea del fichero de entrada y escribirá esa misma línea en el fichero destino.
5. Una vez alcanzado el final del fichero origen, se cerrará el mismo y a continuación, se añadirá una línea adicional al fichero destino. Tras añadir esta línea, se cerrará también el fichero destino.

yo he realizado esto..no se si esta bien no me da error al compilar pero cuando se me abre la aplicacion y pongo el nombre doy intro y se me cierra... alguien que me pueda decir si el ejercicio esta bien y que es lo que esta mal..gracias!!!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
Program Ficheros;
var
	Origen, Destino : text;
	Nombre_1, Nombre_2: string;
	linea, lineas: string;
 
Begin
	write ('Introduzca el nombre del fichero original: ');
	readln (Nombre_1);
	assign (origen, Nombre_1);
	Reset (origen);
	write ('Introduzca el nombre del fichero destino: ');
	readln (Nombre_2);
	if Nombre_2 <> Nombre_1 then
	Begin
		assign (Destino, Nombre_2);
		rewrite (Destino);
		write ('Escriba la linea que desea incorporar: ');
		readln (linea);
	End
	Else
		writeln ('Nombre de fichero ya existente');
	while (not eof (origen)) do
	begin
		readln (origen, lineas);
		writeln (destino, lineas);
 
	end;
	close (origen);
	writeln (destino, linea);
	close (destino);
end.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 112
Bronce
Ha mantenido su posición en Pascal/Turbo Pascal (en relación al último mes)
Gráfica de Pascal/Turbo Pascal

ficheros texto

Publicado por juanba (40 intervenciones) el 03/06/2019 15:44:32
Hola. Te presento un par de ideas con respecto a tu programa:
La primera y más importante es la razón por la cual "falla" el programa al introducir el nombre del primer fichero. Probablemente el fichero designado por Nombre_1 no existe o no se puede acceder a él por algún motivo y la función reset(origen) falla y termina la aplicación inmediatamente.
Para evitar esto se debe.cancelar la directiva i+ y comprobar inmediatamente el resultado de las operaciones de entrada/salida para ver si ha habido un error. El código tendría que ser algo así:

1
2
3
4
5
6
7
{$i-}  Reset (origen);  {$i+}
  if IOResult <> 0 then
  begin
    writeln('Error al abrir el fichero ' + Nombre_1 + '. Pulse Enter');
    readln;
    exit;
  end;

La función IOResult devuelve un código de error que da más información respecto a la causa del fallo de E/S. Es importante saber que al consultar una vez sobre el resultado de una operación E/S se resetea el valor de error de manera que una segunda llamada a iOResult para volver a obtener un código de error, devolvería cero. O sea, en Pascal:

1
2
3
4
5
6
7
{$i-}reset(origen);
if IOResult <> 0 then
begin
  writeln('Error de entrada/salida. El código de error es ' + IOResult);
  readln;
  exit;                    // Terminar el programa
end;

visualizaría el mensaje 'El código de error es 0'. La codificación correcta sería algo así como:

1
2
3
4
5
6
7
8
{$i-}reset(origen);
ResultIO := IOResult;          // Se debe de haber declarado la vaariable ResultIO como integer
if ResultIO <> 0 then           // ResultIO contiene el código de error
begin
  writeln('Error de entrada/salida. El código de error es ', ResultIO);
  readln;
  exit;                    // Terminar el programa
end;

Si se quiere visualizar un texto explicativo del error hay que mirar la documentación del Pascal que se esté empleando para obtener el significado de cada código de error. Por ejemplo, en mi sistema, si el fichero no existe me da un IOResult igual a 2 'File not found'.

La segunda idea es respecto al flujo del programa. Se hace la comprobación de que los nombres de fichero origen y destino no sean iguales y se presenta un mensaje de error en caso de que lo sean. Correcto. Pero a continuación se continúa haciendo la copia del origen sobre el destino y como los dos nombres son el mismo, se estaría intentado copiar el origen sobre sí mismo, lo cual probablemente lleve a un estropicio. Así pues, habría que poner toda la parte de copia dentro del begin..end que sigue a Nombre_1 <> Nombre_2.

Con toda esta parrafada de explicación, el programa podría quedar así:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
Program Ficheros;
var
  Origen, Destino : text;
  Nombre_1, Nombre_2: string;
  linea, lineas: string;
  ResultIO: integer;
 
begin
  write ('Introduzca el nombre del fichero original: ');
  readln (Nombre_1);
  assign (origen, Nombre_1);
  {$i-}reset(origen){$i+};
  ResultIO := IOResult;          // Se debe de haber declarado la vaariable ResultIO como integer
  if ResultIO <> 0 then           // ResultIO contiene el código de error
  begin
    writeln('Error de entrada/salida. El código de error es ', ResultIO, ' Pulse Enter');
    readln;
    exit;                    // Terminar el programa
  end;
{                            // O bien, algo más sencillo
  if IOResult <> 0 then
  begin
    writeln('Error al abrir el fichero ' + Nombre_1 + '. Pulse Enter');
    readln;
    exit;
  end;
}
  writeln ('Introduzca el nombre del fichero destino: ');
  readln (Nombre_2);
 
  if Nombre_2 <> Nombre_1 then
  Begin
  	assign (Destino, Nombre_2);
  	rewrite (Destino);
  	write ('Escriba la linea que desea incorporar: ');
  	readln (linea);
        while (not eof (origen)) do
        begin
        	readln (origen, lineas);
        	writeln (destino, lineas);
        end;
 
        close (origen);
        writeln (destino, linea);
        close (destino);
        writeln('Se ha creado el fichero ', Nombre_2, ' igual a ', Nombre_1,
          ' junto con el texto añadido');
        readln;
  End
  Else                                 // Los dos nombres son el mismo
  begin
    writeln ('Nombre de fichero ya existente');
    readln;
  end;
end.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar