2011-10-15 175 views
0
bool CReadWrite::write(unsigned long long offset, void* pvsrc, unsigned long long nbytes) 
{ int m_WriteResult; 

    pFile = fopen("E:\\myfile.bin","wb"); 

    if (!pFile){ 
     puts("Can't open file"); 
     return false; 
    } 

    fseek(pFile,SIZE_OF_FILE-1,SEEK_SET); 
    fwrite(pvsrc,1,1,pFile); 
    fseek(pFile,offset,SEEK_SET); 

printf("fseek(pFile,SIZE_OF_FILE-1,SEEK_SET); returned -- ", fseek(pFile,SIZE_OF_FILE-1,SEEK_SET)); 

printf("fwrite(pvsrc,1,1,pFile); returned -- %d", fwrite(pvsrc,1,1,pFile)); 


    printf("Current file pointer position is : %d\n",ftell(pFile)); 
    m_WriteResult = fwrite (pvsrc, 1, nbytes, pFile); 

    if (m_WriteResult == nbytes){ 
     puts("Wrote to file"); 
     printf("The number of bytes written to the file is : %d\n\n",m_WriteResult); 
     fclose(pFile); 
     return true; 
    } 
    else{ 
     puts("Unable to write to File."); 
    fclose(pFile); 
    return false; 
    } 
} 

main.cpp中:讀寫緩衝區發出

char* pWriteBuffer; 
char* pReadBuffer; 
int nbytes = 85; 
int nbytes2= 10; 

pWriteBuffer = new char [nbytes]; 
pReadBuffer = new char [nbytes]; 

CReadWrite test; 


for(Bufferndx = 0; Bufferndx<nbytes; Bufferndx++){ 
    pWriteBuffer[Bufferndx] = Bufferndx; 
} 
test.write(20,pWriteBuffer,50); 

for(Bufferndx = 10; Bufferndx;Bufferndx--){ 
    pWriteBuffer[Bufferndx] = Bufferndx; 
} 
test.write(30,pWriteBuffer,nbytes2); 

test.read(5,pReadBuffer,85); 

delete[] pWriteBuffer; 
delete[] pReadBuffer; 

這是我計劃的一部分寫入給定的緩衝區。寫函數被賦予一個偏移量,一個源和多少個字節來寫。

它首先檢查文件是否能夠打開,fseek s到我想要的文件大小-1,然後寫入一個字節。然後在文件中給出fseek s給出的偏移量。如果它成功地寫了nbytes,它會打印出一些東西,然後關閉文件。否則,它會打印出無法寫入和關閉文件。

在我的主要,我只是測試,我的代碼實際上寫了我想要的,我有兩個for循環有兩個後寫道。此後我也在做test.read,但我不確定爲什麼我無法看到正確的結果,我認爲我應該在編譯時進入調試模式。

僅供參考,read類函數幾乎與write相同,但當然fread

我的問題是:爲什麼我沒有得到結果,當我逐步使用調試模式,爲什麼我無法看到緩衝區被正確填充。這「幾乎」就像我的write s/read沒有真正發生。

編輯:我在「試圖做」是填充一個85字節的緩衝區(我最大的緩衝區)。

  • 我的test.write(20,pWriteBuffer,50)將從偏移量20開始並寫入50個字節,也就是說。抵消20 - 70。
  • 我的第二個寫test.write(30,pWriteBuffer,nbytes2)將從偏移量30開始,寫10個字節,又名。抵消20-30。
  • 第三,我讀了整個事情,我應該能夠告訴所有寫入發生在哪裏。

或者這是計劃,但我沒有看到,當我調試。另外,也許有人可以提供一些線索上這一點,但我審查過它,它看起來像我......

fseek(pFile,SIZE_OF_FILE-1,SEEK_SET); 
fwrite(pvsrc,1,1,pFile); 
每次我寫的這是不對的

...我不應該求每次寫入時使文件變大。呃

printf(「fwrite(pvsrc,1,1,pFile); returned - %d」,fwrite(pvsrc,1,1,pFile)); //打印1

printf(「fseek(pFile,SIZE_OF_FILE-1,SEEK_SET); returned - 」,fseek(pFile,SIZE_OF_FILE-1,SEEK_SET)); //打印出0

+0

「**當我逐步使用調試模式**時,爲什麼我沒有得到結果」是否意味着您在不使用調試步驟時可以得到正確的結果? – Kashyap

+0

你有什麼?你期望得到什麼? –

+0

見上面編輯 – Questioneer

回答

1

下面是我看到的問題:

  1. fopen the file with "wb",如果存在的話這將截斷文件或創建如果不存在一個新的。那麼你期望如何尋求第20個字節呢?
  2. SIZE_OF_FILE設置在哪裏或者更重要的是它的設置是否正確?

建議:永遠不要忘記檢查你打電話的所有功能的返回碼。打印出來。像你這樣做:if (!pFile){ /*...*/}

E.g.

fseek(pFile,SIZE_OF_FILE-1,SEEK_SET); 
fwrite(pvsrc,1,1,pFile); 
fseek(pFile,offset,SEEK_SET); 
// should be 
std::cout << "fseek(pFile,SIZE_OF_FILE-1,SEEK_SET); returned -- " << fseek(pFile,SIZE_OF_FILE-1,SEEK_SET) << std::endl; 
printf("fwrite(pvsrc,1,1,pFile); returned -- %d", fwrite(pvsrc,1,1,pFile)); 
int retCode; 
if((retCode = fseek(pFile,offset,SEEK_SET)) != 0) 
    std::cout << "fseek(pFile,offset,SEEK_SET) returned non-zero code -- " << retCode << std::endl; 

不要混淆,我剛剛展示了3種不同的打印3種不同調用信息的方式。你可以選擇任何一種方式(最好是第三種方式)並在任何地方使用。

+0

@ thekashyap:2.它是一個磅定義,即1024。不確定你在第一個問題上指的是什麼 – Questioneer

+1

1st prob:請參閱fopen()參考(添加到帖子的鏈接)。請參閱您正在使用的模式的說明。對於第二部分,你是否添加了我問過的痕跡?如果沒有,請按照建議更新你的代碼,然後用你正在調用的每個f *函數的返回代碼更新你的文章。 – Kashyap

+1

使用printf版本..和你的原始代碼是C++的情況下,你不知道.. :) – Kashyap