Как Вы открываете файл в C++?

Элемент, который вы пытались найти, не был в DOM , когда ваш скрипт работал.

Позиция вашего DOM-зависимого скрипта может оказать глубокое влияние на его поведение. Браузеры анализируют HTML-документы сверху донизу. Элементы добавляются в DOM, и сценарии выполняются (как правило), когда они встречаются. Это означает, что порядок имеет значение. Как правило, скрипты не могут найти элементы, которые появляются позже в разметке, потому что эти элементы еще не добавлены в DOM.

Рассмотрим следующую разметку; сценарий # 1 не находит

, а сценарий # 2 преуспевает:


test div

Итак, что вы должны делать? У вас есть несколько вариантов:


Вариант 1: Переместите свой скрипт

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


  
  

Примечание: размещение скриптов внизу как правило, считается лучшей практикой .


Вариант 2: jQuery's ready()

Отмените свой сценарий до тех пор, пока DOM не будет полностью проанализирован, используя ready() :



Примечание. Вы можете просто привязать к DOMContentLoaded или window.onload, но у каждого есть свои оговорки. jQuery ready() предоставляет гибридное решение.


Вариант 3: Делегирование событий

Делегированные события имеют преимущество в том, что они могут обрабатывать события из элементов-потомков, которые будут добавлены в документ позже.

blockquote>

Когда элемент вызывает событие (при условии, что это bubbling g6], и ничто не останавливает его распространение), каждый родитель в родословной этого элемента также получает событие. Это позволяет нам привязать обработчик к существующему элементу и примерным событиям, когда они пузырятся от его потомков ... даже те, которые добавлены после присоединения обработчика. Все, что нам нужно сделать, это проверить событие, чтобы узнать, был ли он поднят нужным элементом и, если да, запустите наш код.

jQuery on() выполняет эту логику для нас. Мы просто предоставляем имя события, селектор для желаемого потомка и обработчик событий:



Примечание: Обычно этот шаблон зарезервированы для элементов, которые не существовали во время загрузки или , чтобы избежать прикрепления большого количества обработчиков. Также стоит отметить, что, пока я прикреплял обработчик к document (для демонстрационных целей), вы должны выбрать ближайшего надежного предка.


Вариант 4: Атрибут defer

Используйте атрибут defer в

Для справки, вот код из этого внешнего скрипта :

document.getElementById("test").addEventListener("click", function(e){
   console.log("clicked: %o", this); 
});

Примечание: атрибут defer, безусловно, кажется , как волшебная пуля , но важно знать об оговорках ... 1. defer может использоваться только для внешних скриптов, т. е. для тех, у кого есть атрибут src. 2. знать о поддержке браузера , то есть: ошибка реализации в IE & lt; 10

27
задан Ziezi 14 December 2015 в 12:43
поделиться

3 ответа

Существует три способа сделать это, в зависимости от Ваших потребностей. Вы могли использовать олдскульный путь C и назвать fopen/fread/fclose, или Вы могли использовать C++ fstream средства (ifstream/ofstream), или если Вы используете MFC, используйте класс CFile, который обеспечивает функции для выполнения фактических операций файла.

Все они подходят и для текста и для двоичного файла, хотя ни один не имеет определенную readline функциональность. Что Вы, скорее всего, сделали бы, вместо этого в этом случае использование fstream классы (fstream.h), и используйте потоковые операторы (< < и>>), или чтение функционируют к блокам чтения-записи текста:

int nsize = 10;
char *somedata;
ifstream myfile;
myfile.open("<path to file>");
myfile.read(somedata,nsize);
myfile.close();

Примечание, что при использовании Visual Studio 2005 или более высокий, традиционный fstream не могут быть доступными (существует новая реализация Microsoft, которая немного отличается, но выполняет то же самое).

9
ответ дан DannySmurf 28 November 2019 в 05:28
поделиться

Необходимо использовать ifstream , если Вы просто хотите читать (используйте ofstream для записи, или fstream для обоих).

Для открытия файла в текстовом режиме сделайте следующее:

ifstream in("filename.ext", ios_base::in); // the in flag is optional

Для открытия файла в режиме двоичного счета просто необходимо добавить "двоичный" флаг.

ifstream in2("filename2.ext", ios_base::in | ios_base::binary ); 

Использование ifstream.read() функция для чтения блока символов (в двоичном файле или текстовом режиме). Используйте getline() функция (это глобально) считать всю строку.

30
ответ дан Derek Park 28 November 2019 в 05:28
поделиться

fstream являются большими, но я пойду немного глубже и скажу Вам [приблизительно 112] RAII.

проблема с классическим примером состоит в том, что Вы вынуждены закрыть файл собой, подразумевая, что необходимо будет изогнуть архитектуру к этой потребности. RAII использует автоматический вызов деструктора в C++ для закрытия файла для Вас.

Обновление : кажется что станд.:: fstream уже реализует RAII, таким образом, код ниже бесполезен. Я сохраню его здесь для потомства и как пример RAII.

class FileOpener
{
public:
    FileOpener(std::fstream& file, const char* fileName): m_file(file)
    { 
        m_file.open(fileName); 
    }
    ~FileOpeneer()
    { 
        file.close(); 
    }

private:
    std::fstream& m_file;
};

можно теперь использовать этот класс в коде как это:

int nsize = 10;
char *somedata;
ifstream myfile;
FileOpener opener(myfile, "<path to file>");
myfile.read(somedata,nsize);
// myfile is closed automatically when opener destructor is called

Изучение, как работы RAII могут сохранить Вас некоторые головные боли и некоторые главные ошибки управления памятью.

-2
ответ дан Vincent Robert 28 November 2019 в 05:28
поделиться
Другие вопросы по тегам:

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