не удается запустить программу с указателем и fstream в Visual Studio

#c #visual-studio-2017 #fstream

#c #visual-studio-2017 #fstream

Вопрос:

Я могу запустить свою программу в codeblock или Visual studio 2015, но она не работает в Visual Studio 2017

 #include <iostream>
#include <fstream>
#include <cstdlib>
#include <string>
using namespace std;
void replacechar(char *filenguon, char ktc, char ktm)
{
    fstream fs(filenguon, ios::in | ios::out);
    if (!fs)
        cout << "khong the tim thay" << endl;
    else
    {
        char ch;
        while (fs.get(ch))
        {
            if (ch == ktc)
            {
                int pos = fs.tellg();
                pos--;
                fs.seekp(pos);
                fs.put(ktm);
                fs.seekg(pos   1);
            }
        }
    }
}

int main()
{
    replacechar("caua.txt", 'r', 'R');
    return 0;
}
  

Ошибка:

   Error C2664   'void replacechar(char *,char,char)': cannot convert argument 1 from 'const char [9]' to 'char *'   

    Error (active)  E0167   argument of type "const char *" is incompatible with parameter of type "char *" 

    Warning C4244   'initializing': conversion from 'std::streamoff' to 'int', possible loss of data    
  

Я могу запустить свою программу в codeblock или Visual studio 2015, но она не работает в Visual Studio 2017

Комментарии:

1. что именно не работает? есть ошибка? это неправильный результат?

2. извините. Я только что обновил

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

4. Итак, когда вы пишете «выполнить», вы имеете в виду «построить»? Потому что это ошибки компилятора. Изменение этого также помогло бы уменьшить путаницу.

5. char *filenguon ==> const char *filenguon , int pos = fs.tellg(); ==> auto pos = fs.tellg();

Ответ №1:

Изменить

 void replacechar(char *filenguon, char ktc, char ktm)
  

Для

 void replacechar(const char *filenguon, char ktc, char ktm)
  

Правила о строковых литералах изменились в C 11 (я думаю). Они являются постоянными данными, и поэтому любой параметр функции, которому вы передаете строковый литерал, должен быть объявлен с помощью const .

И, как указано в комментариях, измените

 int pos = fs.tellg();
  

Для

 auto pos = fs.tellg();
  

Возврат из tellg не является int , используя auto вы просите компилятор использовать правильный тип, каким бы он ни был.

Ответ №2:

Вам не разрешается передавать const char* (в вашем случае строковый литерал "caua.txt" ) в функцию, принимающую неконстантное значение char* .

Измените свою подпись на void replacechar(const char *filenguon, char ktc, char ktm) .

Ответ №3:

Два метода:
1.

 void replacechar(const char *filenguon, char ktc, char ktm)
{
    //TODO
}
  
    2.
 char str[]={"caua.txt";};
replacechar(str, 'r', 'R');
  

это должно сработать, «caua.txt «является const char* , это изменение на char* путем копирования по одному или const_cast<char*>