2014-09-23 7 views
2

, 우리는 나는 다음과 같은 얻을 fcntl.h를 사용하고 unistd.h C++ 문자열을 사용하여 . 입력 문자열의 내용과 함께 파일이 생성됩니다. 하지만, 왜이 라인의 작동하지 않습니다 : 여기에 C++ 문자열 읽기의 기능에서 fcntl.h

statusOfFunction = read(fileDescriptor, reading.c_str(), 10); 
Error: No matching function call to "read" 

statusOfFunction = read(fileDescriptor, reading, 10); 
Error: No matching function call to "read" 

statusOfFunction = read(fileDescriptor, &reading, 10); 
No error throws up, but does not get executed 

statusOfFunction = read(fileDescriptor, &reading.c_str(), 10); 
Error: No matching function call to "read" 

https://www.dropbox.com/s/lnw208uo3xurqxf/Basic%20Unix%20Operations%20on%20Text%20Files.cpp?dl=0

는 참조 용 프로그램입니다. 감사합니다. :)

+0

'읽기'는 무엇입니까? 'man 2 read'에 따르면'ssize_t read (int fd, void * buf, size_t count);에 따라 프로토 타입을'read'에 매치 할 필요가 있습니다. 그래서 충분히 큰 버퍼에 대한 void 포인터가되도록 읽기가 필요합니다 10 바이트 (또는'count'가 무엇이든)를 저장합니다. – PSkocik

+0

기본 리눅스 프로그래밍 과정에서'const '가 의미하는 것을 아직 다루지 않았습니까? – WhozCraig

답변

0

statusOfFunction = read(fileDescriptor, reading.c_str(), 10); 

의 문제는 c_strconst 포인터를 반환하는 선언이다. 그렇지 않으면 올바른 메소드가 닫힙니다.

당신이 적어도 10 개 문자가 포함 된 문자열을 만드는 데 필요한 모든의

첫째 : 그런 다음 주소의 운영자 &를 사용하여 당신이 얻을 수있는, 일정하지 않은 포인터를 전달해야

std::string temp_string(10, ' '); // Creates a string contains 10 spaces 

을 그리고 문자열 배열 인덱싱 연산자 [] :

statusOfFunction = read(fileDescriptor, &temp_string[0], temp_string.length()); 

그리고 마지막으로 당신이 실제 문자열에 할당 :

reading = std::string(temp_string, 0, statusOfFunction); 

물론 statusOfFunction을 확인해야합니다 (-1 일 때) 또는 파일 끝 (0 일 때)이 오류가 아닙니다.


읽기 위해 시도한 다른 모든 방법은 매우 잘못되었습니다.

+0

여전히 작동하지 않습니다. ( https://www.dropbox.com/s/lnw208uo3xurqxf/Basic%20Unix%20Operations%20on%20Text%20Files.cpp?dl=0 코드를 확인하십시오. ? –

+0

@NadeemAhmedNajeeb 우선, 할당 된 메모리가있는 문자열을 생성하라는 내용을 놓친 것입니다. 링크 된 코드에서 수행 한 작업은 빈 문자열로 읽혀지며 정의되지 않은 동작이 발생합니다. –

+0

나는 시도했지만 오류가 발생했습니다. std :: string sample (10); 초기화에 일치하는 생성자가 없습니다. 또한 [10] 샘플을 사용하여 시도했지만 []이 (가) 오버로드 될 수 있습니다. 나도 틀렸어. –

0

read는 버퍼가 읽은 데이터를 채울 것으로 예상합니다.

당신이하고있는 일은 위험합니다.

char 버퍼를 할당하고 read으로 문자열 길이 뒤에 널 문자를 추가해야합니다. c_str 함수는 문자열 클래스에서 사용하는 내부 버퍼를 노출합니다. 읽기 전용입니다.

문자열 개체 자체를 덮어 쓰면 나중에 사용할 때 충돌이 발생할 수 있습니다.

char buff[11]; 
size_t bytes_read = read(fd, buff, 10); 
buff[bytes_read] = 0; // terminate string 
string myString(buff); 
+0

답변 해 주셔서 감사합니다. 그래서 C++ 문자열을 사용하면 Unix 라이브러리가 크지 않을 수 있습니다. –

+0

사용 방법은 권장하지 않습니다. I/O를위한 C++ 클래스가 있습니다. 저수준 C 함수를 문자열 클래스와 혼합하는 것은 위험합니다. 어쨌든'c_str()'은 const 배열을 돌려 주므로 절대 수정하면 안된다. – egur

+0

유닉스에도 C++ I/O를 사용할 수 있습니까? –