Vaclav_ Ответов: 3

Вопрос c++ - передача char * в fstream не удается-как это сделать правильно ?


Мне нравится передавать параметр char* (file ) функции и использовать переменную file для создания объекта типа fstream.



int C_Utility::Sub_file_open (char *file, char *option) {
	fstream file; //create object of fstream class
        file.open(file, ios::in);
...


Приведенный выше код дает мне
file.open(file, ios::in);
std::fstream file’ shadows a parameter
  fstream file;  ... 


Что я уже пробовал:

fstream хочет char , поэтому string тоже не работает.

3 Ответов

Рейтинг:
23

phil.o

Не присваивайте одинаковое имя параметру метода и внутренней переменной; вы назвали оба параметра file вместо этого используйте различные имена.


Vaclav_

Итак, как мне указать, что я хочу работать с переданным параметром (файлом)?

Stefan_Lang

Ты не можешь! Вы должны использовать другое имя для вашей локальной переменной. Я думал, что решение уже довольно ясно на этот счет.

CPallini

5.

Рейтинг:
14

CPallini

Цитата:
Итак, как мне указать, что я хочу работать с переданным параметром (файлом)?
int C_Utility::Sub_file_open (char *filename, char *option) 
{
  fstream file; //create object of fstream class
  file.open(filename, ios::in);
  //..

или, если вы предпочитаете
int C_Utility::Sub_file_open (char *filename, char *option) 
{
  ifstream file(filename); //create object of fstream class
  //..


phil.o

5 б :)

Рейтинг:
10

Richard MacCutchan

file.open(file, ios::in);

Вы назвали свое имя. fstream файл, и первый параметр, который должен быть a char* (видеть класс basic_fstream | Microsoft Docs[^]) вы также назвали file. Таким образом, компилятор думает, что вы пытаетесь передать fstream возражать против open метод а fstream- что не имеет никакого смысла.

Не используйте имена типа file для чего-либо, так как они могут легко конфликтовать с реальными типами. Используйте разумные осмысленные имена, это избавит вас от головной боли в будущем.


Vaclav_

По видимому fstream открывает файл следовательно я действительно делал это дважды и это
помог" создать конфликт. Использование "затенения" вместо "дубликата" помогает с моим словарным запасом , однако я бы предпочел "дубликат"....

Stefan_Lang

Что вы вообще подразумеваете под "дублированием" и "затенением"? У меня есть сильное чувство, что вы пытаетесь использовать концепции из другого языка в C++, который не имеет этой концепции!? (Кроме того, последняя строка кода в вашем OP использует знак "как комментарий", но в C++ он не имеет такого значения!)

В случае, если три уже предложенных решения не были достаточно ясны:
В C/C++, когда вы объявляете переменную с определенным именем, все будущие (то есть более поздние в коде) ссылки на это имя будут ссылаться на эту конкретную переменную! Если у вас уже была переменная с таким именем, например параметр функции, этот объект будет недоступен на протяжении всего остального кода!

Это общее правило в C/C++, что вы никогда не должны повторно использовать имя! Даже если при определенных обстоятельствах компилятор допускает переопределение символа, это никогда не служит разумной цели. (и если вы думаете, что это так, то либо вы просто ошибаетесь, либо вы можете думать о концепции, которая не существует в C++)

tl;dr: не используйте повторно имена переменных в C++! Когда-либо.*

* P. S: это относится к одной функции - вы, конечно, можете использовать одно и то же имя в другой функции. (Технически, сфера действия, а не функция, но это уже немного опасно)

Richard MacCutchan

Вы забыли упомянуть правила области действия.

Stefan_Lang

Я намеренно пропустил их: даже если вы можете временно использовать имена в ограниченном объеме, это просто напрашивается на неприятности. Если и есть действительно разумный вариант использования для этого, то я о нем не слышал.

Richard MacCutchan

Это не то, что я имел в виду. Ваш комментарий подразумевает, что если вы используете имя для переменной в любом месте вашей программы, вы никогда не должны использовать то же самое имя снова. Но это нормально-использовать одно и то же имя в разных областях. Хотя есть много людей, которые не до конца понимают эту концепцию.

Stefan_Lang

Ах, конечно. Я почему-то всегда подразумевал область действия функции, не говоря об этом. Изменил свой комментарий, чтобы прояснить это.

Конечно, как вы говорите, вы можете повторно использовать имена в разных областях внутри функции, но вы должны быть осторожны. Мой совет был на линии "лучше быть в безопасности, чем сожалеть", а не буквальный запрет.

Richard MacCutchan

И, конечно, ваш совет-очень хороший совет. Я пытался пошутить, но, вероятно, запутался в переводе.

Richard MacCutchan

Это не совсем так. Он откроет файл, если вы передадите имя файла в конструктор, но если нет, вам нужно будет вызвать open.

Vaclav_

Я хотел бы добавить этот "комментарий".
Я спросил: "как это сделать правильно?.."
CPallini-это лучшее решение , и с комбинацией последнего комментария Ричарда фактически объясняет, почему - независимо от моей ошибки в использовании одних и тех же имен - создание объекта ifstream или создание объекта ifstream с параметром является главным отличием . Спасибо за все комментарии - решены и многое другое.