2017-08-08 31 views
1

我正在嘗試使用unistd庫編寫/讀取文本文件。稍後我會將它部署到/ dev路徑中的文件。 我正在嘗試使用std::vector而不是char buffer[]。所以我寫了兩個實現,一個使用vector和另一個char緩衝區。在文件中都寫得很好,但都不能讀取文件。unistd read()不起作用

這裏是我的測試代碼:

使用緩衝焦炭

void tests_using_buffer_of_char(const std::string &path) 
{ 
    int file_descriptor_char; 
    char buffer[8] ={0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08}; 
    std::cout << sizeof(buffer) << std::endl;  

    for(auto i = 0; i < sizeof(buffer); i++) 
     std::cout << buffer[i] << std::endl; 

    file_descriptor_char = open(path.c_str(), O_RDWR); 
    if(file_descriptor_char != -1) 
     std::cout << "open with success " << path << std::endl; 

    std::size_t size = strlen(buffer); 
    ssize_t write_bytes = write(file_descriptor_char, buffer, size); 
    std::cout << size << " <-- size of buffer " << write_bytes << " <-- size of writed bytes" << std::endl; 

    memset(&buffer[0], 0, sizeof(buffer)); 

    ssize_t read_bytes = read(file_descriptor_char, &buffer, size); 
    std::cout << size << " <-- size of buffer " << read_bytes << " <-- size of readed bytes" << std::endl; 

    for(auto i = 0; i < sizeof(buffer); i++) 
     std::cout << buffer[i] << std::endl; 

    if(close(file_descriptor_char) != -1) 
     std::cout << "close with success "<< path << std::endl; 
} 

使用矢量

void tests_using_buffer_of_vector(const std::string &path) 
{ 
    int file_descriptor_vector; 
    std::vector<char> buffer = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08}; 
    std::cout << buffer.size() << std::endl; 

    for(auto i : buffer) 
     std::cout << i << std::endl; 

    file_descriptor_vector = open(path.c_str(), O_RDWR); 
    if(file_descriptor_vector != -1) 
     std::cout << "open whit success " << path << std::endl; 

    ssize_t write_bytes = write(file_descriptor_vector, buffer.data(), buffer.size()); 
    std::cout << buffer.size() << " <-- size of buffer " << write_bytes << " <-- size of writed bytes" << std::endl; 

    buffer.clear();  

    ssize_t read_bytes = read(file_descriptor_vector, buffer.data(), write_bytes); 
    std::cout << buffer.size() << " <-- size of buffer " << read_bytes << " <-- size of readed bytes" << std::endl;  

    for(auto i : buffer) 
     std::cout << i << std::endl; 

    if(close(file_descriptor_vector) != -1) 
     std::cout << "close with success " << path << std::endl; 

} 
的緩衝

謝謝大家!

+1

'unistd'不是一個庫,它是POSIX系統上的一個C頭文件。當你知道* xy *是一個*標準函數時,你可能不應該寫「* xy *不起作用」,這對於數百萬程序員來說工作得很好,你可能只是錯誤地使用了它。 –

+0

你是對的!謝謝你的建議。在接下來的問題中,我會更加精確和不那麼籠統地討論這個問題。 – gorn

回答

1

1]只需使用fclose並重新打開文件。

2] fseek(fp, 0, SEEK_SET);

3] rewind(fp);

你都指向與file pointer該文件的結束。

1

您必須將文件描述符重置爲位於文件的開頭,然後在重新使用它進行寫入之後進行讀取。您可以關閉該文件並重新打開該文件,也可以尋求開始。

lseek(file_descriptor_vector, SEEK_SET, 0); 

在閱讀之前不要清除你的載體。方法將基本上釋放與矢量相關的內存。

+0

謝謝!這對我有用。 – gorn

-1

我不是專家,我仍然認爲自己是一名C/C++初學者,但我想幫助你。 不知道它是否屬實,但在嘗試從文件開始讀取之前不應該關閉寫入緩衝區? 我認爲最初你正在努力寫作。雖然文件仍處於「繁忙」狀態,但您仍嘗試從中讀取文件,但不能讀取文件,因爲該文件仍處於編寫階段。 作爲一般規則。 讀取或寫入關閉或重置文件描述符/緩衝區後。

+0

不要吝嗇,我非常感謝你願意提供幫助和貢獻,但如果你不確定,請不要寫回答。這就是評論意見(除其他外)。回答您*可以*回答*的問題*,您將有足夠的代表評論*很快*。 –

+0

好的,對不起,下次我會更加小心。 –

+0

只是一個建議,如果你認爲你有答案,你可以使用你的想法在網上檢查你的事實,爲自己證明,然後提交。會爲你節省尷尬,並將作爲學習期限 – Swift