質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

1461閲覧

c++、ファイルの入出力について

m_W

総合スコア12

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2018/12/26 10:04

ファイルの入出力

C++を勉強しています。ユーザにファイル名を尋ね、そのファイル名の最後に「.backup」を付けた複製を作成するプログラムを実装したいのですが

発生している問題・エラーメッセージ

error: invalid operands of types ‘char*’ and ‘const char [8]’ to binary ‘operator+’ filename = filename + ".backup"; ^

となってしまいます

該当のソースコード

C++

1#include <iostream> 2#include <fstream> 3#include <math.h> 4using namespace std; 5 6int main(){ 7 8 char* filename; 9 cout << "ファイル名を入力してください。バックアップを作成します"; 10 cin >> filename; 11 filename = filename + ".backup"; 12 cout << "ファイル名:" << filename; 13 14 // ファイル書き出し 15 16 ofstream fout(filename); 17 if(!fout){cout << "出力ファイルが開けません"; return 1;} 18 for(int i = 0; i < 5; i++){ 19 fout << i << "\n"; 20 } 21 fout.close(); 22 23 // ファイル読み込み 24 25 ifstream fin(filename); 26 if(!fin){cout << "入力ファイルが開けません"; return 1;} 27 string str; 28 int i; 29 while(!fin.eof()){ 30 fin >> str; 31 cout << "line " << i << ": " << str << "\n"; 32 i++; 33 } 34 fin.close(); 35 return 0; 36} 37 38

試したこと

初めての質問なので分かりづらかったらすみません。
filename = filename + ".backup";
あたりの型が原因かと考え
char* backup = ".backup";
というコードを挿入してから
filename = filename + backup;
としてみましたがダメでした…
原因と解決法を教えていただきたいです。よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

C++では、文字列を扱うためのクラスstd::stringが用意されています。
その恩恵に預かれば良いでしょう。

C++

1#include <iostream> 2#include <string> 3 4int main() { 5 std::string stem; 6 std::cin >> stem; 7 8 stem += ".backup"; 9 std::cout << stem << "\n"; 10}

標準入力

spam

実行結果 Wandbox

spam.backup

投稿2018/12/26 10:09

LouiS0616

総合スコア35660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m_W

2018/12/26 10:18

回答ありがとうございます。 stemの部分をfilenameにし、#include<string>を追加して実行したところ error: no matching function for call to ‘std::basic_ofstream<char>::basic_ofstream(std::__cxx11::string&)’ ofstream fout(filename); ^ というエラーと error: no matching function for call to ‘std::basic_ifstream<char>::basic_ifstream(std::__cxx11::string&)’ ifstream fin(filename); ^ というエラー、そしてたくさんのnote: 文が返されました 記述を忘れてましたがLinuxで動かしてます
LouiS0616

2018/12/26 10:26 編集

C++11以降のバージョンでコンパイルすれば解消するかと。 古いC++は非常に使いづらいので、可能ならバージョンをあげておくことをお勧めします。
LouiS0616

2018/12/26 10:27

どうしてもバージョンが変えられない場合は、fout(filename.c_str()) とでも書いてください。
m_W

2018/12/26 10:33

ありがとうございます! 都合によりバージョンが変えられないため ofstream fout(filename); と ifstream fin(filename); の部分をご指摘の通り変更したところ無事コンパイルできました!
guest

0

C++においては、char型の文字列は+で連結することはできません。
std::stringを使うのがもっとも直感に合っているでしょう。

C++

1std::string filename; 2cin >> filename; 3 4filename = filename + std::string(".backup");

投稿2018/12/26 10:09

kazto

総合スコア7196

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m_W

2018/12/26 10:27

回答ありがとうございます。 #include<string>を追加して実行したところ error: no matching function for call to ‘std::basic_ofstream<char>::basic_ofstream(std::__cxx11::string&)’ ofstream fout(filename); ^ というエラーと error: no matching function for call to ‘std::basic_ifstream<char>::basic_ifstream(std::__cxx11::string&)’ ifstream fin(filename); ^ というエラー、そしてたくさんのnote: 文が返されました 記述を忘れてましたがLinuxで動かしてます 関係ない質問かもしれませんが, using namespase std; とかいてあればstd::の部分は省略できると思っているのですが、 省略しないのが主流なのでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問