Итак, я пытаюсь перезаписать макрос, который у меня есть в файле заголовка, но я не могу открыть его с помощью std::ifstream. Возможно ли вообще читать/записывать в существующий заголовочный файл или существуют разрешения по умолчанию, которые не позволяют программам изменять содержимое заголовочного файла?
std::ifstream versionH;
char temp[100];
versionH.open("..\temp.h");
if (!versionH.is_open()) {
std::cout << "Didn't open" << std::endl;
return 1;
}
while (!versionH.eof()) {
versionH >> temp;
std::cout << temp << std::endl;
}
Я надеюсь, что смогу прочитать файл заголовка и отобразить его содержимое, но 'versionH.is_open()' возвращает false. Есть ли что-то, что мне здесь не хватает?
Не должно быть проблем с этим. Самомодифицирующийся код НО не является хорошей идеей. ТАКЖЕ, что цикл while неверен. Посмотрите: Почему iostream::eof внутри условия цикла (т.е. while (!stream.eof())
) считается неправильным?
WhozCraig предложил исправить, убрав обратную косую черту. ИЛИ вы можете использовать косую черту, которая в настоящее время поддерживается во всех системах: "../темп.ч" Также versionH >> temp;
читает слово, разделенное пробелом (не строку). Попробуйте std::getline()
и предпочитайте std::string temp;
char temp[100];
.
Заголовочный файл — это такой же файл, как и любой другой. Конечно, вы можете написать ему. Вопрос в том, должен ли вы. Вероятно, есть лучший способ добиться того, что вы пытаетесь сделать.
@WhozCraig Вау, это сработало, какое простое решение. Спасибо!
@MartinYork Спасибо, чувак, я изменил проверку while по твоему предложению.
Is it possible to read and write to a header file?
Заголовки — это файлы. Можно читать и записывать файлы (при условии, что файл существует, а процесс имеет достаточные разрешения и т. д.). Следовательно, мы можем сделать вывод, что файлы заголовков можно читать и записывать.
Обратите внимание, что изменение файла заголовка, который использовался для компиляции программы, не влияет на скомпилированную программу. Это может повлиять только на программы, скомпилированные с использованием модифицированного файла.
Кроме того, файлы в контексте компиляции программы не имеют отношения к программе. Только файлы в файловой системе, в которой выполняется программа, могут быть прочитаны.
Is there something I'm missing here?
Вероятно, файл не существует. Имя файла самое подозрительное. Действительно ли он содержит символ табуляции (\t
) или вы намеревались написать (Windows) разделитель каталогов? Обратная косая черта — это escape-символ, поэтому, чтобы записать ее в строковом литерале, вы должны экранировать ее (с другой обратной косой чертой: \\
).
Или вы можете просто использовать /
, который отлично работает как в Unix, так и в Windows.
Эту обратную галочку следует экранировать как двойную обратную галочку:
..\\temp.h
. И обратите внимание, единственный способ, который «работает» (термин используется очень свободно), - это если текущий рабочий каталог во время выполнения находится на один уровень глубже, чем расположениеtemp.h
на диске. Почему-то мне кажется, что наименьшая из ваших проблем впереди, но это, наверное, проблема с кодом это.