GNU/Linux >> Znalost Linux >  >> Linux

Jak napsat soubor s C v Linuxu?

Za prvé, kód, který jste napsali, není přenosný, i když jej zprovozníte. Proč používat funkce specifické pro operační systém, když existuje způsob, jak to udělat dokonale nezávislý na platformě? Zde je verze, která používá pouze jeden soubor záhlaví a je přenosná na jakoukoli platformu, která implementuje standardní knihovnu C.

#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:Odkaz na glibc říká:

Obecně byste se měli držet spíše proudů než deskriptorů souborů, pokud neexistuje nějaká konkrétní operace, kterou chcete provést a kterou lze provést pouze na deskriptoru souboru. Pokud jste začínající programátor a nejste si jisti, jaké funkce použít, doporučujeme, abyste se soustředili na funkce formátovaného vstupu (viz Formátovaný vstup) a formátovaný výstup (viz Formátovaný výstup).

Pokud máte obavy o přenositelnost svých programů na jiné systémy než GNU, měli byste si také uvědomit, že deskriptory souborů nejsou přenosné jako proudy. Můžete očekávat, že jakýkoli systém běžící na ISO C bude podporovat proudy, ale systémy bez GNU nemusí podporovat deskriptory souborů vůbec nebo mohou implementovat pouze podmnožinu funkcí GNU, které fungují na deskriptorech souborů. Většina funkcí filedescriptoru v GNUlibrary je však zahrnuta ve standardu POSIX.1.


Musíte zapsat() data read() do nového souboru:

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);

Aktualizace:přidána správná otevření...

Btw, O_CREAT může být OR'd (O_CREAT | O_WRONLY). Ve skutečnosti otevíráte příliš mnoho popisovačů souborů. Stačí jednou otevřít.


Musíte provést write ve stejné smyčce jako read .


Linux
  1. Linux + Jak ignorovat (filtrovat) soubor s mezerou?

  2. Jak vytvořit systém souborů ZFS pomocí komprese souborů v systému Linux

  3. Jak vytvořit soubor s danou velikostí v Linuxu?

  1. Jak napsat linuxového démona s .Net Core

  2. Jak nahradit soubor v jar příkazovým řádkem v linuxu?

  3. Jak smazat soubor s tímto názvem na linuxu:-]???????q

  1. Jak spravovat možnosti souborů Linux

  2. Jak najít soubor v Linuxu

  3. Jak přejmenovat soubor v Linuxu?