Чтение и запись проблем с буфером - PullRequest
0 голосов
/ 15 октября 2011
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); возвращено -% d", fwrite (pvsrc, 1,1, pFile)); // распечатывает 1

printf ("fseek (pFile, SIZE_OF_FILE-1, SEEK_SET); возвращено -", fseek (pFile, SIZE_OF_FILE-1, SEEK_SET)); // распечатывает 0

1 Ответ

1 голос
/ 15 октября 2011

Вот проблемы, которые я вижу:

  1. Вы открываете файл с помощью "wb" , который усекает файл, если он существует, или создает новый, если он не существует. Так как же вы ожидаете получить 20-й байт?
  2. Где установлен SIZE_OF_FILE или, что более важно, правильно ли он установлен?

Предложения: Никогда не забывайте проверять коды возврата всех функций, которые вы вызываете. Распечатайте их. Как вы сделали в этом: if (!pFile){ /*...*/}

* 1014 Е.Г. *

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 разных вызовов. Вы можете выбрать любой способ (желательно третий) и использовать везде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...