파일 복사는 프로그래밍에서 일반적인 작업입니다. 분별력과 효율성을 모두 가지고 이 작업에 접근하는 것이 중요합니다. 이 기사에서는 C에서 파일을 복사하는 다양한 기술을 살펴보고 장점과 단점을 논의합니다. 표준 C 함수, POSIX 함수, C 스트림 버퍼 등을 다룰 것입니다.
이 접근 방식은 C 표준 라이브러리 함수 fread를 사용합니다. () 및 fwrite()는 블록 단위로 데이터를 읽고 씁니다. 낮은 수준의 제어를 제공하지만 명시적인 버퍼 관리가 필요하고 장황할 수 있습니다.
// ANSI-C-WAY #include <stdio.h> // fopen(), fclose(), fread(), fwrite(), BUFSIZ #include <cstdio> // size_t using namespace std; int main() { // Define buffer size (BUFSIZE default is 8192 bytes) const size_t BUFFER_SIZE = 4096; char buf[BUFFER_SIZE]; size_t size; FILE* source = fopen("from.ogv", "rb"); FILE* dest = fopen("to.ogv", "wb"); while (size = fread(buf, 1, BUFFER_SIZE, source)) { fwrite(buf, 1, size, dest); } fclose(source); fclose(dest); return 0; }
이 접근 방식은 POSIX 읽기( ) 및 write() 함수를 사용하여 ANSI C 접근 방식보다 파일 작업에 대한 더 많은 제어를 제공합니다. 더 큰 파일을 처리하고 오류를 더 세심하게 처리할 수 있는 기능을 제공합니다.
// POSIX-WAY #include <fcntl.h> // open() #include <unistd.h> // read(), write(), close() #include <stdio.h> // BUFSIZ using namespace std; int main() { // Define buffer size (BUFSIZE default is 8192 bytes) const size_t BUFFER_SIZE = 4096; char buf[BUFFER_SIZE]; size_t size; int source = open("from.ogv", O_RDONLY, 0); int dest = open("to.ogv", O_WRONLY | O_CREAT | O_TRUNC, 0644); while ((size = read(source, buf, BUFFER_SIZE)) > 0) { write(dest, buf, size); } close(source); close(dest); return 0; }
이 접근 방식은 C I/O 스트림 버퍼를 활용합니다. rdbuf() 메서드를 활용하여 전체 파일을 복사함으로써 C 런타임이 낮은 수준의 I/O를 처리할 수 있으므로 간결하고 간단합니다.
// KISS-C++-Streambuffer-WAY #include <iostream> // cout, cin #include <fstream> // ifstream, ofstream using namespace std; int main() { ifstream source("from.ogv", ios::binary); ofstream dest("to.ogv", ios::binary); dest << source.rdbuf(); source.close(); dest.close(); return 0; }
C copy() 알고리즘은 한 파일에서 다른 파일로 데이터를 효율적으로 복사할 수 있습니다. 이 접근 방식은 STL의 강력한 반복자의 이점을 활용하므로 버퍼 관리를 수동으로 처리할 필요가 없습니다.
// COPY-ALGORITHM-C++-WAY #include <iostream> // cout, cin #include <fstream> // ifstream, ofstream #include <ctime> // clock_t, clock() #include <algorithm> // copy #include <iterator> // istreambuf_iterator, ostreambuf_iterator using namespace std; int main() { ifstream source("from.ogv", ios::binary); ofstream dest("to.ogv", ios::binary); istreambuf_iterator<char> begin_source(source); istreambuf_iterator<char> end_source; ostreambuf_iterator<char> begin_dest(dest); copy(begin_source, end_source, begin_dest); source.close(); dest.close(); return 0; }
이 접근 방식은 자체 버퍼를 할당합니다. 메모리 관리 및 버퍼 크기를 세밀하게 제어할 수 있습니다. 누수를 방지하려면 신중한 메모리 할당 해제가 필요합니다.
// OWN-BUFFER-C++-WAY #include <iostream> // cout, cin #include <fstream> // ifstream, ofstream #include <ctime> // clock_t, clock() using namespace std; int main() { ifstream source("from.ogv", ios::binary); ofstream dest("to.ogv", ios::binary); // Determine file size and allocate buffer source.seekg(0, ios::end); ifstream::pos_type size = source.tellg(); source.seekg(0, ios::beg); char* buffer = new char[size]; // Copy file source.read(buffer, size); dest.write(buffer, size); // Cleanup delete[] buffer; source.close(); dest.close(); return 0; }
Linux 관련 sendfile() 함수는 커널 수준 최적화 및 직접 데이터 전송을 활용합니다. 파일 설명자 사이. 이 접근 방식은 특히 대용량 파일 전송에서 효율성이 뛰어난 것으로 알려져 있습니다.
// LINUX-WAY #include <iostream> // cout, cin #include <sys/sendfile.h> // sendfile #include <fcntl.h> // open #include <unistd.h> // close #include <sys/stat.h> // stat #include <sys/types.h> // stat #include <ctime> // clock_t, clock() using namespace std; int main() { int source = open("from.ogv", O_RDONLY, 0); int dest = open("to.ogv", O_WRONLY | O_CREAT | O_TRUNC, 0644); // Determine file size struct stat stat_source; fstat(source, &stat_source); // Copy file sendfile(dest, source, 0, stat_source.st_size); close(source); close(dest); return 0; }
제공되는 접근 방식은 복잡성, 효율성 및 제어 측면에서 다양합니다. 다음은 장점과 한계를 요약한 것입니다.
Approach | Pros | Cons |
---|---|---|
ANSI C | Low-level control, portable | Verbose, buffer management required |
POSIX | More control than ANSI C, handles large files | Still requires explicit buffer management |
KISS-C -Streambuffer | Concise, stream buffer manages I/O | High-level, less control over buffering |
COPY-ALGORITHM-C | Efficient, STL iterators handle data transfer | Requires caution with large files to avoid buffering issues |
OWN-BUFFER-C | Fine-grained control over buffer management | Memory management must be handled carefully to avoid leaks |
LINUX-sendfile() | Fast, kernel-level optimization | Linux-specific, requires elevated privileges |
가장 좋은 접근 방식을 선택하는 것은 애플리케이션의 특정 요구 사항에 따라 다릅니다. 작은 파일의 경우 ifstream/ofstream의 단순성으로 충분할 수 있습니다. 효율성이 중요한 대용량 파일이나 시나리오의 경우 sendfile()은 훌륭한 옵션입니다. 궁극적으로 사용 사례에 가장 적합한 솔루션을 결정하려면 다양한 접근 방식을 테스트하고 벤치마킹하는 것이 좋습니다.
위 내용은 C에서 파일을 안전하고 빠르게 복사하는 가장 좋은 방법은 무엇이며 각각의 장점과 단점은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!