GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie schreibe ich eine Datei mit C in Linux?

Zunächst einmal ist der von Ihnen geschriebene Code nicht portierbar, selbst wenn Sie ihn zum Laufen bringen. Warum betriebssystemspezifische Funktionen verwenden, wenn es eine vollkommen plattformunabhängige Möglichkeit gibt? Hier ist eine Version, die nur eine einzige Header-Datei verwendet und auf jede Plattform portierbar ist, die die C-Standardbibliothek implementiert.

#include <stdio.h>

int main(int argc, char **argv)
{
    FILE* sourceFile;
    FILE* destFile;
    char buf[50];
    int numBytes;

    if(argc!=3)
    {
        printf("Usage: fcopy source destination\n");
        return 1;
    }

    sourceFile = fopen(argv[1], "rb");
    destFile = fopen(argv[2], "wb");

    if(sourceFile==NULL)
    {
        printf("Could not open source file\n");
        return 2;
    }
    if(destFile==NULL)
    {
        printf("Could not open destination file\n");
        return 3;
    }

    while(numBytes=fread(buf, 1, 50, sourceFile))
    {
        fwrite(buf, 1, numBytes, destFile);
    }

    fclose(sourceFile);
    fclose(destFile);

    return 0;
}

EDIT:Die Glibc-Referenz hat folgendes zu sagen:

Im Allgemeinen sollten Sie lieber Streams als Dateideskriptoren verwenden, es sei denn, Sie möchten eine bestimmte Operation ausführen, die nur mit einem Dateideskriptor ausgeführt werden kann. Wenn Sie ein Programmieranfänger sind und sich nicht sicher sind, welche Funktionen Sie verwenden sollen, empfehlen wir Ihnen, sich auf diese zu konzentrieren die formatierten Eingabefunktionen (siehe formatierte Eingabe) und formatierte Ausgabefunktionen (siehe formatierte Ausgabe).

Wenn Sie Bedenken hinsichtlich der Portierbarkeit Ihrer Programme auf andere Systeme als GNU haben, sollten Sie sich darüber im Klaren sein, dass Dateideskriptoren nicht so portabel sind wie Streams. Sie können davon ausgehen, dass jedes System, auf dem ISO C läuft, Streams unterstützt, aber Nicht-GNU-Systeme unterstützen möglicherweise überhaupt keine Dateideskriptoren oder implementieren nur eine Teilmenge der GNU-Funktionen, die mit Dateideskriptoren arbeiten. Die meisten Dateideskriptorfunktionen in der GNU-Bibliothek sind jedoch im POSIX.1-Standard enthalten.


Sie müssen die read()-Daten in die neue Datei schreiben():

ssize_t nrd;
int fd;
int fd1;

fd = open(aa[1], O_RDONLY);
fd1 = open(aa[2], O_CREAT | O_WRONLY, S_IRUSR | S_IWUSR);
while (nrd = read(fd,buffer,50)) {
    write(fd1,buffer,nrd);
}

close(fd);
close(fd1);

Update:Korrekte Öffnungen hinzugefügt...

Übrigens kann das O_CREAT ODER-verknüpft werden (O_CREAT | O_WRONLY). Sie öffnen tatsächlich zu viele Dateihandles. Öffnen Sie einfach einmal.


Du musst write machen in der gleichen Schleife wie read .


Linux
  1. So verwalten Sie Linux-Dateifunktionen

  2. So finden Sie eine Datei in Linux

  3. Linux + Wie ignoriert (filtert) man Dateien mit Leerzeichen?

  4. So erstellen Sie ein ZFS-Dateisystem mit Dateikomprimierung unter Linux

  5. So schreiben Sie einen Linux-Daemon mit .Net Core

So verwenden Sie den Linux-rm-Befehl mit Beispielen

So lesen Sie eine Datei mit Leerzeichen in Linux

So schreiben Sie Daten in eine Datei unter Linux

So verknüpfen Sie eine Datei unter Linux per Symlink

So gehen Sie Dateinamen mit Leerzeichen in Linux an

So planen Sie Jobs mit Cron in Linux