2013-02-12 1 views
1

내가 txt 파일을 가지고 있고 txt 파일에 "doc1.doc, doc2.doc, doc3.doc".. 등이 쓰여질 수 있습니다. 내 코드에서 이 txt 파일을 읽고 "doc1.doc, doc2.doc .."문서를 찾으십시오.파일을 폴더에 동적으로 C++로 넣으십시오

나는 cxt를 사용하여 txt 파일을 읽는 동안이 doc 파일을 폴더에 넣고 싶습니다. 가능한가?

이미 폴더가 있고 새 폴더를 만들 필요가 없다고 가정합니다. 단지 폴더에 파일을 넣는 것이 걱정입니다.

편집 : Linux를 사용하고 있습니다.

+1

http://advancedlinuxprogramming.com/과 같은 Linux 또는 Posix 프로그래밍에 대한 유용한 책을 읽었습니까? –

+0

가능할 수도 있지만, 당신이하고 싶은 것이 무엇인지는 명확하지 않습니다. – Matt

답변

1

귀하의 질문이 완전한 답변을 얻는데 충분한 정보를 제공하지 않습니다. 언어로서의 C++은 실제로 그 의미에서 폴더 나 파일을 다루는 함수를 가지고 있지 않습니다. 왜냐하면 C++은 플랫폼에 독립적이어서 Windows, MacOS, iOS, Android, Linux에서 파일 시스템조차 갖고 있지 않은 다른 많은 장치에서 실행되도록 C++ 코드를 컴파일 할 수 있기 때문입니다.

물론 귀하의 경우에는 Windows 또는 Linux를 언급하고있을 것입니다. 그렇다면 어떤 파일인지에 따라 파일 시스템 기능을 사용하여 파일 시스템의 파일을 복사하거나 이동할 수 있습니다.

Windows의 경우 Win32 API에는 파일을 복사하는 데 CopyFile 및 CopyFileEx 함수가 있고 파일을 이동하거나 이름을 바꾸려면 MoveFile 및 MoveFileEx 함수가 있습니다.

Linux의 경우 sendfile API 함수를 사용하여 커널을 사용하여 파일을 복사 할 수 있습니다.

오픈/읽기/쓰기 기능을 사용하여 파일의 내용을 다른 파일로 복사하려면 C/C++에서 플랫폼 독립적 인 코드를 작성할 수 있습니다 (즉, 소스 파일을 읽기 모드로 열고, 소스 파일의 끝에 도달 할 때까지 쓰기 모드에서 대상 파일을 연 다음 소스에서 읽기 및 목표에 기록)하지만 플랫폼 별 라이브러리가 없으면 다른 파일 시스템 기능을 재생하는 것이 더 어렵지는 않습니다.

int inputFileDesc; 
int outputFileDesc; 
struct stat statBuffer; 
off_t offset = 0; 

// open the source file, and get a file descriptor to identify it later (for closing and sendfile fn) 
inputFileDesc = open ("path_to_source_file", O_RDONLY); 

// this function will fill the statBuffer struct with info about the file, including the size in bytes 
fstat (inputFileDesc, &statBuffer); 

// open the destination file and get a descriptor to identify it later (for closing and writing to it) 
outputFileDesc = open ("path_to_destination_file", O_WRONLY | O_CREAT, statBuffer.st_mode); 

// this is the API function that actually copies file data from source to dest; 
// it takes as params the descriptors of the input and output files and an offset and length for the amount of data to copy over 
sendfile (outputFileDesc, inputFileDesc, &offset, statBuffer.st_size); 

close (outputFileDesc); // closes the output file (identified by descriptor) 
close (inputFileDesc);  // closes the input file (identified by descriptor) 
+0

어떻게 시스템 호출을 할 수 있습니까? 좋아요 : system ("cp (doc1.doc) newfolder"); doc1.doc 대신 무엇을 쓸 수 있습니까? –

+0

@gozdebaris 무엇을 쓰고 싶습니까? – ALOToverflow

+0

이 솔루션은 시스템 기능을 사용하도록 제안합니다. 시스템 콜은 system ("cp doc1.doc newfolder")과 같이 만들어 졌다는 것을 알게되었습니다. 이제 문제는 내 코드에이 줄을 쓸 수 없다는 것입니다. txt 파일에서 "doc1.doc"을 읽습니다. –

2

당신은 Giomm이다 glibmm의 일부를 사용할 수 있습니다 : 당신은 당신이 리눅스에서 할 것인지 지정 이후

UPDATE

, 여기 당신이 sendfile을 기능을 사용할 수있는 방법 Glib에 대한 C++ 바인딩. 봐, 매우 직관적 (낮은 수준 이상 시스템/POSIX의 C 함수) : 디렉토리 반복에 대한

http://developer.gnome.org/glibmm/stable/classGio_1_1File.html#details

이 하나가 유용 할 수 있습니다 :

http://developer.gnome.org/glibmm/stable/classGlib_1_1Dir.html

그것은 휴대용도입니다! Glib가 작동하는 모든 곳에서 작동합니다. Windows, Linux, MacOS ... 당신은 리눅스에 국한되지 않습니다. 그것은 Glim과 glibmm에 의존한다는 것을 의미하지만, Glib은 GNU/Linux 소프트웨어에서 매우 일반적으로 사용되며, GTK 또는 그 바인딩을 사용하는 모든 GUI 응용 프로그램은 Glib을로드합니다. 솔루션은 실제로 추가 종속성을 추가하지 않습니다.

특히 Linux를 사용하는 경우 큰 장점은 무료 소프트웨어의 소스 코드로 이동하여 코드가 수행하는 작업을 확인할 수 있다는 것입니다.예를 들어, Gnome의 git 저장소 (git.gnome.org에서 사용 가능)로 이동 한 다음 문서와 함께 작동하는 프로젝트로 이동합니다 (예 : 텍스트 편집기 gedit을보고 파일에 문서를 저장하는 방법을 확인하십시오. 또는 C++로 작성된 프로젝트 (Gedit는 C로 작성) (예 : Glom 또는 Inkscape 또는 Gnote)를 확인하고 수행 한 내용을 확인하십시오.

관련 문제