2016-12-01 2 views
-1

У меня есть следующая программа, ниже которой копируется весь текстовый файл, в котором вы вводите имя исходного файла и файла назначения. Мне нужно изменить мою программу, чтобы оценить команду Linux cp.Оценить команду копирования файла Linux в c

Моя команда subcopy будет принимать в качестве параметра имя исходного файла а, имя файла в назначения и начала и конца линии линий исходного файла, которые будут скопированы в файл назначения , как в примере ниже:

subcopy.o Sourcefile.txt destinationfile.txt 100 200

линий 100 копируется - 200 от Sourcefile.txt до destinationfile.txt

Отредактировано: Я проделал всю тяжелую работу. Осталось выбрать количество строк, которые я хочу скопировать из одного файла в другой. Обратите внимание на пример, как это работает.

#include <stdio.h> 
#include <stdlib.h> 


void cp(char source_file[],char destination_file[],int lines_copy) 
{ 

     char ch; 
    FILE *source, *destination; 




    source = fopen(source_file, "r"); 

    if(source == NULL) 
    { 
     printf("File name not found, make sure the source file exists and is ending at .txt\n"); 
     exit(EXIT_FAILURE); 
    } 



    destination = fopen(destination_file, "w"); 

    if(destination == NULL) 
    { 
     fclose(source); 
     printf("Press any key to exit...\n"); 
     exit(EXIT_FAILURE); 
    } 

    while((ch = fgetc(source)) != EOF) 
     fputc(ch, destination); 

    printf("Copied lines %d from %s to %s \n",lines_copy,source_file,destination_file,".txt"); 

    fclose(source); 
    fclose(destination); 

} 

int main() 
{ 


    char s[20]; 
    char d[20]; 
    int lines; 

    printf("-Enter the name of the source file ending in .txt\n-Enter the name of the destination file ending in .txt\n-Enter the number of lines you want to copy\n\n"); 

    printf(">subcopy.o "); 
    gets(s); 
     printf("destination file-> "); 
     gets(d); 
     printf("Lines: "); 
     scanf("%d",&lines); 

    cp(s,d,lines); 







    return 0; 

} 
+0

Поиск в Google «линукс копия команды файла» –

+0

нормально, может быть, я не прав, я изменил название, чтобы скопировать команду –

+0

спасибо за редактирования @Am_I_Helpful –

ответ

0

Зачем писать программу для этого? Вы можете сделать это с помощью простой команды bash:

SOURCE=/path/to/source/file 
DEST=/path/to/dest/file 
START=100 
END=200 

tail -n +$START $SOURCE | head -n $(($END - $START)) > $DEST 
+0

Вы можете уточнить? –

+0

Я хочу этого в c m8 –

+0

Вам не нужно делать это в C; вы можете использовать стандартные команды. –

1

Mmap файл и поиск смещений к определенному номеру строки. Так как отображаемый файл на самом деле является памятью, нет дополнительных процедур хранения после обнаружения смещений. Я написал небольшой код, чтобы получить номер строки. Вы должны изменить код для копирования данных в файл назначения.

#include <unistd.h> 
#include <sys/types.h> 
#include <sys/mman.h> 
#include <sys/stat.h> 
#include <fcntl.h> 
#include <err.h> 

/* following code assumes all file operations succeed. In practice, 
* return codes from open, close, fstat, mmap, munmap all need to be 
* checked for error. 
*/ 
int read_file_line(const char *path, int line_no) 
{ 
    struct stat s; 
    char *buf; 
    off_t start = -1, end = -1; 
    size_t i; 
    int ln, fd, ret = 1; 

    if (line_no == 1) start = 0; 
    else if (line_no < 1){ 
     warn("line_no too small"); 
     return 0; /* line_no starts at 1; less is error */ 
    } 

    line_no--; /* back to zero based, easier */ 

    fd = open(path, O_RDONLY); 
    fstat(fd, &s); 

    buf = mmap(0, s.st_size, PROT_READ, MAP_PRIVATE, fd, 0); 

    /* optional; if the file is large, tell OS to read ahead */ 
    madvise(buf, s.st_size, MADV_SEQUENTIAL); 

    for (i = ln = 0; i < s.st_size && ln <= line_no; i++) { 
     if (buf[i] != '\n') continue; 

     if (++ln == line_no) start = i + 1; 
     else if (ln == line_no + 1) end = i + 1; 
    } 

    if (start >= s.st_size || start < 0) { 
     warn("file does not have line %d", line_no + 1); 
     ret = 0; 
    } else { 
     /* Do Copy data from this block into destination */ 
    } 

    munmap(buf, s.st_size); 
    close(fd); 

    return ret; 
} 
+0

* использовать команду поиска до 100 позиций. * Эта команда работает в строках, а не в байтах. Вы не можете искать смещения * байта * и ожидать соответствия строк. –

+0

@AndrewHenle благодаря исправлению меня, я редактировал свое сообщение. даже я написал простой код, чтобы найти номер строки в файле. –

Смежные вопросы