Понимание Писать в Unix - PullRequest
       1

Понимание Писать в Unix

0 голосов
/ 02 марта 2011

Нам был назначен проект сжатия ASCII для системного программирования, и мне трудно с одной конкретной строкой в ​​моем коде.

Я задал вопрос о сжатиии я адаптировал код массива к своей программе после проработки первых дюжин букв файла образца на бумаге.В ddd значения массива packed[] - это то, что я разработал на бумаге, но значения не записываются в файл.

    unsigned char packed[7]; //compression storage
    int i, jCount;
    int j;

    int bufferLength= sizeof(unpacked)/sizeof(char);
    //loop through the buffer array
    for (i=0; i< bufferLength-1; i++){
        j= i%7;
        jCount++;

        //fill up the compressed array
        packed[i]= packer(unpacked[i], unpacked[i+1], j);

        //compressed array is full, write to file, then clear
        if ((j%7==6) && (j > 1)){
            int writeLoop;
            for (writeLoop=0; writeLoop < 8; writeLoop++){
                //printf("%X", packed[writeLoop]);  //write to screen
                write(openWriteFile, &packed[writeLoop], 1);//this is my trouble, write to file
            }

            memset(&packed[0], 0, sizeof(packed)); //clear array
        }
//more code down here for padding the end of short bytes.

Функция записи ожидает const void * какВторой аргумент, поэтому я ссылаюсь на значение этого конкретного слота массива, но ничего не записывается в файл.

Когда я удаляю &, я получаю предупреждение о компиляции.

Будем благодарны за любые предложения направить меня по правильному пути.

Ответы [ 2 ]

1 голос
/ 02 марта 2011

Вы читаете за концом массива. Вы объявляете packed[7], затем получаете доступ к элементам от 0 до 7 (8 элементов) в цикле записи.

Как правило, вы используете write для записи серии байтов, а не только одного. В вашем случае это означает замену

    int writeLoop;
    for (writeLoop=0; writeLoop < 8; writeLoop++){
        write(openWriteFile, &packed[writeLoop], 1);
    }

с

    write(openWriteFile, packed, 8);

и изменение вашего объявления на

unsigned char packed[8]; //compression storage

А может быть, это должна быть 7-байтовая запись? В этом случае замените 8 с 7 с.

0 голосов
/ 02 марта 2011

Я думаю, это должно быть packed[j] = ..., а не packed[i].И как отмечает chrisaycock, вы можете просто написать весь упакованный массив, вам не нужен цикл: write(openWriteFile, packed, sizeof packed); И вам следует избегать всех этих литералов ... у вас есть 3 экземпляра по 7, один экземпляр из 8 и один экземпляриз 6, когда вы должны иметь единственную определенную константу и использовать это + или - 1 в зависимости от ситуации.Также jCount неинициализирован.

РЕДАКТИРОВАТЬ: Вот код без этих проблем:

#define PACKEDSIZE 7 // Why 7?

    unsigned char packed[PACKEDSIZE]; //compression storage
    int i, jCount = 0;
    int j = 0;

    int bufferLength = sizeof(unpacked)/* /sizeof(char) ... not needed because sizeof(char) is 1 in all conforming implementations */;
    //loop through the buffer array
    for( i = 0; i < bufferLength-1; i++ ){
        jCount++;

        //fill up the compressed array
        packed[j]= packer(unpacked[i], unpacked[i+1], j);

        if( ++j == sizeof packed ){
            if( write(openWriteFile, packed, sizeof packed) != sizeof packed )
                reportWriteError(); // stub -- do real error handling here
            //memset(packed 0, sizeof packed); // this isn't necessary
            j = 0;
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...