#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*>