C++ читая неподписанный символ из потока файла

Нам нужно увидеть больше, чем это; Мы должны быть в состоянии воспроизвести проблему. И вы нигде не используете ключевое слово index в своем скрипте!

При этом я должен подчеркнуть, что следующее не фактическое решение.

Поскольку я не делаю jQuery - я попытаюсь продемонстрировать возможное решение для вас, используя чистый JavaScript, также будучи (пере) маркированным как Vanilla .:

  [].slice.call( 
        document.querySelectorAll('figure')
        ).
        forEach( 
              function( x ) {
                    x.onclick = function( ) { /*reg fig clicked here*/ 
                    recentlyViewed.innerHTML = 
                    this.getAttribute('src')+", "+ this.getAttribute('data-square');
                    };             
              }
        );

мы предполагаем, что здесь :: 1. цифра, по которой щелкают, должна получить регистрацию события щелчка, связанную с функцией, которая предположительно: 1.a) отдает свой URL-адрес контента вместе с некоторым пользовательским содержимым атрибута квадрата данных. 2. также предполагая, что «недавно просмотренный» - это идентификатор целевого содержимого HTML, подлежащего перезаписи.

12
задан Svante 2 March 2009 в 23:24
поделиться

3 ответа

C++ действительно требует, чтобы реализация только обеспечила явные специализации для двух версий символьных черт:

std::char_traits<char>
std::char_traits<wchar_t>

Потоки и строки используют те черты для выяснения множества вещей, как значение EOF, сравнение диапазона символов, расширения символа к интервалу и такого материала.

Если Вы инстанцируете потока как

std::basic_ifstream<unsigned char>

Необходимо удостовериться, что существует соответствующая символьная специализация черты, которую поток может использовать и что эта специализация действительно делает полезные вещи. Кроме того, потоки используют фасеты, чтобы сделать фактическое форматирование и чтение чисел. Аналогично необходимо обеспечить специализации тех слишком вручную. Стандарт даже не требует, чтобы реализация имела полное определение основного шаблона. Таким образом, Вы могли также получить ошибку компиляции:

ошибка: станд. специализации:: char_traits нельзя было инстанцировать.

Я использовал бы ifstream вместо этого (который является a basic_ifstream<char>) и затем пойдите и читайте в a vector<char>. При интерпретации данных в векторе можно все еще преобразовать их в unsigned char позже.

20
ответ дан 2 December 2019 в 04:09
поделиться

Не используйте basic_ifstream, поскольку он требует specializtion.

Используя статический буфер:

linux ~ $ cat test_read.cpp
#include <fstream>
#include <iostream>
#include <vector>
#include <string>


using namespace std;

int main( void )
{
        string filename("file");
        size_t bytesAvailable = 128;

        ifstream inf( filename.c_str() );
        if( inf )
        {
                unsigned char mDataBuffer[ bytesAvailable ];
                inf.read( (char*)( &mDataBuffer[0] ), bytesAvailable ) ;
                size_t counted = inf.gcount();
                cout << counted << endl;
        }

        return 0;
}
linux ~ $ g++ test_read.cpp
linux ~ $ echo "123456" > file
linux ~ $ ./a.out
7

использование вектора:

linux ~ $ cat test_read.cpp

#include <fstream>
#include <iostream>
#include <vector>
#include <string>


using namespace std;

int main( void )
{
        string filename("file");
        size_t bytesAvailable = 128;
        size_t toRead = 128;

        ifstream inf( filename.c_str() );
        if( inf )
        {

                vector<unsigned char> mDataBuffer;
                mDataBuffer.resize( bytesAvailable ) ;

                inf.read( (char*)( &mDataBuffer[0]), toRead ) ;
                size_t counted = inf.gcount();
                cout << counted << " size=" << mDataBuffer.size() << endl;
                mDataBuffer.resize( counted ) ;
                cout << counted << " size=" << mDataBuffer.size() << endl;

        }

        return 0;
}
linux ~ $ g++ test_read.cpp -Wall -o test_read
linux ~ $ ./test_read
7 size=128
7 size=7

использование резерва вместо изменяет размер в первом вызове:

linux ~ $ cat test_read.cpp

#include <fstream>
#include <iostream>
#include <vector>
#include <string>


using namespace std;

int main( void )
{
        string filename("file");
        size_t bytesAvailable = 128;
        size_t toRead = 128;

        ifstream inf( filename.c_str() );
        if( inf )
        {

                vector<unsigned char> mDataBuffer;
                mDataBuffer.reserve( bytesAvailable ) ;

                inf.read( (char*)( &mDataBuffer[0]), toRead ) ;
                size_t counted = inf.gcount();
                cout << counted << " size=" << mDataBuffer.size() << endl;
                mDataBuffer.resize( counted ) ;
                cout << counted << " size=" << mDataBuffer.size() << endl;

        }

        return 0;
}
linux ~ $ g++ test_read.cpp -Wall -o test_read
linux ~ $ ./test_read
7 size=0
7 size=7

Как Вы видите без вызова к (считаемому) .resize, размер вектора будет неправильным. Имейте это в виду. это - общее для использования кастинга, см. cppReference

16
ответ дан 2 December 2019 в 04:09
поделиться

Намного более легкий путь:

#include <fstream>
#include <vector>

using namespace std;


int main()
{
    vector<unsigned char> bytes;
    ifstream file1("main1.cpp", ios_base::in | ios_base::binary);
    unsigned char ch = file1.get();
    while (file1.good())
    {
        bytes.push_back(ch);
        ch = file1.get();
    }
    size_t size = bytes.size();
    return 0;
}
0
ответ дан 2 December 2019 в 04:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: