Your Browser is not longer supported

Please use Google Chrome, Mozilla Firefox or Microsoft Edge to view the page correctly
Loading...

{{viewport.spaceProperty.prod}}

creat, creat64 - Datei neu anlegen (elementar)

&pagelevel(4)&pagelevel

Definition

#include <stdio.h>

int creat(const char *d_name, int modus); int creat64(const char *d_name, int modus);

creat und creat64 öffnen eine Datei zum Neuschreiben:

  • Wenn die Datei noch nicht vorhanden ist, wird sie neu angelegt.

  • Bereits existierende Dateien werden auf die Länge 0 verkürzt.

creat und creat64 liefern eine Dateikennzahl für spätere elementare Zugriffsoperationen (write, read).

Es besteht kein funktionaler Unterschied zwischen creat und creat64, außer dass in der mit dem Filedescriptor verknüpften Dateibeschreibung das Kennzeichen für eine große Datei hinterlegt wird, dh. es wird das O_LARGEFILE Bit gesetzt. Es wird eine Dateikennzahl zurückgegeben, die dazu verwendet werden kann, die Datei über 2 GB hinaus zu vergrößern.

Für die Bearbeitung von Dateien > 2 GB verfahren Sie wie folgt:

Parameter

const char *d_name

Zeichenkette, die den Namen der zu öffnenden Datei angibt. d_name kann sein:

  • jeder gültige BS2000-Dateiname

  • "link=linkname"
    linkname bezeichnet einen BS2000-Linknamen

int modus

Im BS2000 werden hier nur der lbp-Schalter, der Nosplit-Schalter und die Angabe
O_RECORD ausgewertet. Alle anderen Angaben in diesem Parameter werden
ignoriert. Zur Erstellung von portierbaren Programmen sind sie jedoch notwendig, da sie im
UNIX-Betriebssystem die Schutzbitvergabe regeln.

lbp-Schalter

Der lbp-Schalter steuert die Behandlung des Last Byte Pointers (LBP). Er ist nur für Binärdateien mit Zugriffsart PAM relevant und kann mit allen bei open zulässigen Angaben kombiniert werden. Falls als lbp-Schalter O_LBP angegeben ist, wird geprüft, ob LBP-Unterstützung möglich ist. Ist dies nicht der Fall, so schlägt die Funktion creat, creat64 fehl und errno wird auf ENOSYS gesetzt. Weitere Auswirkungen hat der Schalter erst, wenn die Datei geschlossen wird.

O_LBP

Beim Schließen einer Datei, die neu erstellt wurde, wird kein Marker geschrieben und ein gültiger LBP gesetzt. Bei NK-Dateien wird der letzte logische Block mit binären Nullen aufgefüllt, bei K- Dateien wird die Datei bis zum physikalischen Dateiende aufgefüllt.

O_NOLBP

Beim Schließen einer Datei, die neu erstellt wurde, wird der LBP auf Null (=ungültig) gesetzt. Es wird ein Marker geschrieben. Bei NK-Dateien wird der letzte logische Block mit binären Nullen aufgefüllt, bei K-Dateien wird die Datei bis zum physikalischen Dateiende aufgefüllt. Bei NK-Dateien wird der letzte logische Block mit binären Nullen aufgefüllt, bei K- Dateien wird die Datei bis zum physikalischen Dateiende aufgefüllt.

Wird der lbp-Schalter in beiden Varianten angegeben (O_LBP und O_NOLBP), so schlägt die Funktion creat, creat64 fehl und errno wird auf EINVAL gesetzt.

Wird der lbp-Schalter nicht angegeben, hängt das Verhalten von der Umgebungsvariablen LAST_BYTE_POINTER ab (siehe auch "Umgebungsvariable LAST_BYTE_POINTER“ (Last Byte Pointer (LBP))):

LAST_BYTE_POINTER=YES

Die Funktion verhält sich so, als ob O_LBP angegeben wäre.

LAST_BYTE_POINTER=NO

Die Funktion verhält sich so, als ob O_NOLBP angegeben wäre.

Nosplit switch

Dieser Schalter steuert die Verarbeitung von Textdateien mit der Zugriffsart SAM und variabler Satzlänge, wenn zusätzlich eine maximale Satzlänge angegeben ist. Er kann mit jeder der anderen Konstanten kombiniert werden.

O_NOSPLIT

Beim Schreiben mit write werden Sätze, die länger als die maximale Satzlänge sind, auf die maximale Satzlänge gekürzt.

Ist der Schalter nicht angegeben, gilt beim Schreiben Folgendes:

Ein Satz, der länger als die maximale Satzlänge ist, wird in mehrere Sätze aufgeteilt. Hat ein Satz genau die maximale Satzlänge, wird nach diesem ein Satz der Länge Null geschrieben.

Returnwert

Dateikennzahl

positive Zahl, die später bei den elementaren Zugriffsoperationen (write, read) zum Bezeichnen der Datei benutzt wird.

 

 -1

wenn die Datei nicht geöffnet werden konnte, z.B. weil zuviele Dateien geöffnet sind oder d_name kein gültiger Datei- bzw. Linkname ist.

Hinweise

Der BS2000-Dateiname bzw. -Linkname kann in Klein- und Großbuchstaben geschrieben werden, er wird automatisch in Großbuchstaben umgesetzt.

Wird eine nicht vorhandene Datei neu angelegt, wird standardmäßig folgende Datei erzeugt:
Bei KR-Funktionalität (nur bei C/C++ Versionen kleiner V3.0 vorhanden) eine SAM-Datei mit variabler Satzlänge und Standardblocklänge, bei ANSI-Funktionalität eine ISAM-Datei mit variabler Satzlänge und Standardblocklänge.

Bei Verwendung eines Linknamens lassen sich mit dem ADD-FILE-LINK-Kommando folgende Dateiattribute ändern: Zugriffsmethode, Satzlänge, Satzformat, Blocklänge und Blockformat. Siehe auch Abschnitt  "Systemdateien (SYSDTA, SYSOUT, SYSLST)“ .

Wird eine bereits existierende Datei auf die Länge 0 verkürzt, bleiben die Katalogeigenschaften dieser Datei erhalten.

Es können maximal _NFILE Dateien gleichzeitig geöffnet sein. _NFILE ist in <stdio.h> mit 2048 definiert.

Satz-E/A

Zum Eröffnen von Dateien mit satzorientierter Ein-/Ausgabe (Satz-E/A) kann beim Parameter modus die Konstante O_RECORD angegeben werden. Sie kann grundsätzlich mit jeder anderen Konstanten außer O_LBP kombiniert werden.

O_RECORD

Dieser Schalter bewirkt Folgendes:

Die Funktion write schreibt einen Satz in die Datei. Bei SAM- und PAM-Dateien wird der Satz an die aktuelle Dateiposition geschrieben. Bei ISAM-Dateien wird der Satz an die Position geschrieben, die dem Schlüsselwert im Satz entspricht. Ist die Anzahl n der zu schreibenden Zeichen größer als die maximale Satzlänge, wird nur ein Satz mit maximaler Satzlänge geschrieben. Die restlichen Daten gehen verloren.
Bei ISAM-Dateien wird ein Satz nur geschrieben, wenn er mindestens einen vollständigen Schlüssel enthält. Ist bei Dateien mit fester Satzlänge n kleiner als die Satzlänge, wird mit binären Nullen aufgefüllt. Beim Update eines Satzes in einer SAM- oder PAM-Datei darf die Länge des Satzes nicht verändert werden. Die Funktion write liefert auch bei Satz-E/A die Anzahl der tatsächlich geschriebenen Zeichen zurück. 

 

Beispiel

Folgendes Programm schreibt den Inhalt einer Eingabedatei in eine Ausgabedatei. Die Ausgabedatei wird mit creat neu angelegt. Der Name dieser Datei sowie die Dateieigenschaften werden mit einem ADD-FILE-LINK-Kommando (Linkname=LINK) festgelegt.
Mit folgendem Kommando würde z.B. eine ISAM-Datei mit dem Namen OUT.ISAM erstellt:

/ADD-FILE-LINK LINK-NAME=LINK,FILE-NAME=OUT.ISAM,ACCESS-METHOD=ISAM 
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
   char name[50]; 
   char buf; 
   int fin, fout; 
   printf("Name der Eingabedatei?\n"); 
   gets(name); 
   printf("Die Datei %s wird kopiert.\n", name);
   if ((fin = open(name,0)) == -1) 
   {
     perror(name);
     exit(-1); 
   } 
   if ((fout = creat("link=link", 1)) == -1)
   {
     perror("link");
     exit(-1); 
   }
   while(read(fin, &buf, 1) > 0)
   {
     putchar(buf);           /* Protokoll auf stdout */
     write(fout, &buf, 1); 
   } 
   close(fin); close(fout); 
   return 0;
}

Siehe auch

close, fdopen, open, open64, read, write, perror