2016-01-29 10 views
5

La domanda: Recentemente ho acquistato IBM PS2 1989 e sto provando a trasferire file di grandi dimensioni dalla mia macchina più recente basata su UNIX a questo IBM tramite floppy. Ho uno script bash che divide i miei file in blocchi da 2MB, ora sto provando a scrivere un programma Pascal per ricostruire questi file dopo che sono stati trasferiti.Lettura/Scrittura su file su IBM PS/2 precedente in turbo pascal 5.5

Non riesco a trovare i metodi di lettura/scrittura sui file su questo computer. Ho provato vari siti di tutorial pascal, ma sono tutti per le versioni più recenti (il sito che ho seguito con File Handling In Pascal). Sono in grado di creare un file vuoto (come descritto di seguito), ma non riesco a scriverlo. Qualcuno conosce i metodi di lettura e scrittura pascal corretti per questo tipo di computer?

So che questa è una domanda oscura, quindi grazie in anticipo per qualsiasi aiuto tu possa darmi!

L'Dettagli:

Il codice di test corrente che crea correttamente un file è questo:

program testingFiles; 
uses Crt, Win; 

const FILE_NAME = 'testFile.txt'; 
var outFile : File; 

begin 
writeln('creating file ...'); 
Assign(outFile, FILE_NAME); 
rewrite(outFile);  

end. 

Questo è un codice di prova che non funziona, il append() metodo e close() non poteva essere trovato:

Questa è un'alternativa che non ha funzionato, la 012 Il metodostampa sempre sul terminale. Ma altrimenti questo si compila.

program testingFiles; 
uses Crt, Win; 

const FILE_NAME = 'testFile.txt'; 
var outFile : File; 

begin 
writeln('creating file ...'); 
Assign(outFile, FILE_NAME); 

rewrite(outFile); 
writeln('this should be in the file'); 
close(outFile); 

end. 

Il sistema: Come si è accennato in precedenza, questo è un 1989 IBM PS2.

  • Ha Windows 3.0 installato e può anche eseguire i terminali DOS e MS-DOS.
  • Ha Microsoft SMARTDrive Disk Cache versione 3.06
  • Dispone di Turbo Pascal 5.5 installato e sto utilizzando turbo come editor pascal della riga di comando. (il readme è stato aggiornato l'ultima volta nel 1989)
  • Dispone di Turbo debugger 1.5 installato.

Ancora una volta, so che questa è una domanda oscura, quindi grazie in anticipo per qualsiasi aiuto tu possa darmi!

+3

La domanda non è così oscura. I/O di file Pascal di base non sono cambiati da molto tempo. Lo stai solo facendo come esercizio? Sai che DOS 'COPY' può concatenare file, anche quelli binari usando l'opzione'/B'. * Eg. *, 'COPIA File1/B + File2/B File3'. Ma se vuoi farlo in Pascal, hai cercato [gestione dei file in Pascal] (http://wiki.freepascal.org/File_Handling_In_Pascal)? – lurker

+0

@lurker Grazie per la conoscenza di 'COPY', in realtà non lo sapevo e ci provo (sono un ragazzo di linux)! Ma ho letto quella pagina, è il primo link nella domanda. Cambierò il titolo del collegamento in modo che sia più evidente, grazie. –

+1

Non penso che sia necessario 'append' per concatenare i file se si lascia aperto il file di output durante l'intero processo. Dovresti semplicemente "riscrivere" per aprire inizialmente il nuovo file di output per la scrittura. Nel tuo secondo esempio che compila, perché non stai usando 'writeln (outFile, ...)' come descritto nella pagina a cui ti sei collegato? Questo dovrebbe funzionare anche nei più vecchi compilatori Pascal (risale a Niklaus Wirth 1974). Com'è che il tuo secondo esempio viene compilato con 'close' ma il tuo primo non può trovare' close'? – lurker

risposta

0

Ecco un vecchio codice Delphi che dovrebbe essere almeno vicino alla sintassi compatibile che vi darà il succo di copiare un file (con controllo degli errori limitato e gestione delle risorse in caso di errore - lo lascerò come esercizio per te). Funziona per copiare entrambi i contenuti binari e di testo.

program Project2; 

uses 
    SysUtils; 

var 
    NumRead, NumWritten: LongInt; 
    pBuff : PChar; 
    SrcFile, DstFile: File; 
const 
    BuffSize = 2048; // 2K buffer. Remember not much RAM available  

    InFileName = 'somefile.txt'; 
    OutFileName = 'newfile.txt'; 
begin 
    NumRead := 0; 
    NumWritten := 0; 

    AssignFile(SrcFile, InFileName); 
    AssignFile(DstFile, OutFileName); 

    // Allocate memory for the buffer 
    GetMem(pBuff, BuffSize); 

    FileMode := 0;   // Make input read-only 
    Reset(SrcFile, 1); 

    FileMode := 2;   // Output file read/write 
    Rewrite(DstFile, 1); 

    repeat 
    // Read a buffer full from input 
    BlockRead(SrcFile, pBuff^, BuffSize, NumRead); 

    // Write it to output 
    BlockWrite(DstFile, pBuff^, NumRead, NumWritten); 
    until (NumRead = 0) or (NumWritten <> NumRead); 

    // Cleanup stuff. Should be protected in a try..finally, 
    // of course. 
    CloseFile(SrcFile); 
    CloseFile(DstFile); 
    FreeMem(pBuff); 
end. 

Il codice sopra riportato viene compilato in base a Delphi 2007 al momento (la versione più vecchia che ho installato). (Vedere la nota sotto.)

Come nota a margine, si trattava di una versione archiviata di un codice che avevo compilato sia per Delphi 1 a 16 bit che è stato esteso anche a Delphi 2 a 32 bit di nuovo in la metà e la fine degli anni '90. È ancora in giro nei miei repository di origine in un vecchio ramo taggato. Penso di aver bisogno di fare un po 'di potatura. :-) L'ho pulito per rimuovere alcune altre funzionalità e rimosso un sacco di roba {$IFDEF WIN32} ... {$ELSE} ... {$ENDIF} prima di postare.)

memoria
+0

closefile + Assignfile è solo delphi, ma la sostituzione con assign e close dovrebbe funzionare. gli ultimi parametri di blockwrite e read saranno interi o word (che sono a 16 bit), e non a 32 bit, poiché non si può lavorare con i blocchi> 16-bit in TP usando mezzi normali (getmem etc) Usando un la matrice statica per il buffer renderebbe il codice più semplice. –

+0

e iirc freemem richiedono dimensioni in TP. –

+0

@Marco: buoni punti. Tranne che ho detto che stavo postando * codice Delphi * per far partire il poster. Non ho inserito il codice TP, perché non ho un compilatore TP per testarlo prima. :-) –

1

mio Pascal è molto arrugginito ... ma come altri hanno fatto notare, qui è quello che si dovrebbe prendere in considerazione:

program testingFiles; 
uses Crt, System; 
//No need of importin Win Win is for Windows enviorment, however I'm not sure if you need to use System, Sysutils or was there a Dos class??? 

const FILE_NAME = 'testFile.txt'; 
var outFile,inFile : File; 

begin 
writeln('creating file ...'); 
Assign(outFile, FILE_NAME); 
rewrite(outFile); 

//Now Open the first chunk of the file you want to concatenate 

AssignFile(inFile, "fisrt_chunk.dat"); 
reset(inFile); 

while not eof(inFile) do 
begin 
    readln(inFile, s); 
    writeln(outFile,s); 
end; 
close(inFile); 

end. 

non ho Turbo/Borland Pascal installato più così non potevo 't compilare io stesso, nessuna promessa che funzionerà è più come un'idea:

  • cosa fondamentale da ricordare, readln e writeln sarà sempre aggiungere un ritorno alla fine della stringa/linea, leggere e scrivere d'altra parte lascerà il cursore dovunque si trovi senza saltare su una nuova riga.
+0

(1) assignfile è delphi, non TP. (2) usa "testo" come tipo di file per l'I/O di testo. (3) chiudere anche outfile è bello.) Pascal è dichiarato prima dell'uso, quindi è bello dichiarare "s". In ogni caso, OP probabilmente vuole una soluzione blockread/write –

Problemi correlati