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

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

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

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

Q&A

解決済

2回答

9762閲覧

型変換のエラー

fgfnabwym

総合スコア78

C++

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

0グッド

0クリップ

投稿2015/07/07 15:25

while (cnt = fin.read(inbuf, BUF_SIZE))
の部分ですが、
invalid conversion from ‘void*’ to ‘int’
とエラーが出るので
while (cnt = (int)fin.read(inbuf, BUF_SIZE))
としたところ、今度は
invalid cast from type ‘std::basic_istream<char, std::char_traits<char> >’ to type ‘int*’
とエラーが出ます。
型が違うというのは分かるのですが、キャスト変換をしてもダメだったのでどう直していいのか分かりません。

エラーの無くし方を教えて下さい。

lang

1#include <iostream> 2#include <fstream> 3#include <cctype> 4 5#define BUF_SIZE 100 6 7using namespace std; 8 9int main(int argc, char *argv[]) 10{ 11 char ch; 12 char inbuf[BUF_SIZE]; 13 char outbuf[BUF_SIZE]; 14 // 読み込まれたカウント 15 int cnt; 16 // ループ用 17 int i; 18 19 if (argc != 3) { 20 cout << "使い方: CONVERT <入力ファイル名> <出力ファイル名>\n"; 21 return 1; 22 } 23 24 ofstream fout(argv[2]); // 出力ファイルを作成する 25 if (!fout) { 26 cout << "出力ファイルが開けません\n"; 27 return 1; 28 } 29 30 ifstream fin(argv[1]); // 入力ファイルを開く 31 if (!fin) { 32 cout << "入力ファイルが開けません\n"; 33 return 1; 34 } 35 36 // 入力ファイルから読み込む 37
while (cnt = fin.read(inbuf, BUF_SIZE)) {
// エラーの有無をチェック if (!fin.good() && !fin.eof()) { cout << "入出力エラー・・・終了\n"; return 1; } if (!fin.eof()) { // islowerは引数が小文字なら(真)を返す // 変換 for (i = 0;i <cnt ;i++) { if(islower(inbuf[i])) outbuf[i] = toupper(inbuf[i]); else outbuf[i] = tolower(inbuf[i]); } // 出力ファイルに書き込み fout.write(outbuf, BUF_SIZE); } } fin.close(); fout.close(); return 0; }

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

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

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

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

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

guest

回答2

0

ベストアンサー

ifstreamのreadメソッドの戻り値はistreamとなっていて、
読み込んだ個数を返すようにはなっていないようです。

代わりに、ifstreamのgcountメソッドで直前に行った読み込み処理のバイト数が取得できますので、
それを使ったコードを以下に示します。

lang

1#include <iostream> 2#include <fstream> 3#include <cctype> 4 5#define BUF_SIZE 100 6 7using namespace std; 8 9int main(int argc, char *argv[]) 10{ 11 char ch; 12 char inbuf[BUF_SIZE]; 13 char outbuf[BUF_SIZE]; 14 // 読み込まれたカウント 15 streamsize cnt; 16 // ループ用 17 int i; 18 19 if (argc != 3) { 20 cout << "使い方: CONVERT <入力ファイル名> <出力ファイル名>\n"; 21 return 1; 22 } 23 24 ofstream fout(argv[2]); // 出力ファイルを作成する 25 if (!fout) { 26 cout << "出力ファイルが開けません\n"; 27 return 1; 28 } 29 30 ifstream fin(argv[1]); // 入力ファイルを開く 31 if (!fin) { 32 cout << "入力ファイルが開けません\n"; 33 return 1; 34 } 35 36 // 入力ファイルから読み込む 37 38 for (;;) { 39 fin.read(inbuf, BUF_SIZE); 40 cnt = fin.gcount(); 41 if (cnt == 0) { 42 break; 43 } 44 45 // エラーの有無をチェック 46 if (!fin.good() && !fin.eof()) { 47 cout << "入出力エラー・・・終了\n"; 48 return 1; 49 } 50 if (1) { 51 // islowerは引数が小文字なら(真)を返す 52 // 変換 53 for (i = 0;i <cnt ;i++) { 54 cout << inbuf[i] << endl; 55 if(islower(inbuf[i])) outbuf[i] = toupper(inbuf[i]); 56 else outbuf[i] = tolower(inbuf[i]); 57 } 58 // 出力ファイルに書き込み 59 fout.write(outbuf, BUF_SIZE); 60 } 61 } 62 fin.close(); 63 fout.close(); 64 65 return 0; 66}

質問の趣旨から外れますが、読み込み後の変換処理にバグがあり、少なくとも入力'AAAA'に対して出力が''(空)になります。
原因はeof()の判定のタイミングと思われます。

(参考) http://www.cppll.jp/cppreference/cppio_details.html

投稿2015/07/07 16:46

katoken-0215

総合スコア15

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

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

fgfnabwym

2015/07/20 12:56

katoken-0215さん、コードまで載せていただきありがとうございました。
guest

0

fin.readは読み込んだサイズを返すのではなく自身の参照(実際はistream&)を返すのでcntへの変換はできません
読み込んだサイズは別途gcountで取得する必要があります。
fin.readsomeだと読み込んだサイズを返してくれますので期待の動作になると思います。

投稿2015/07/07 16:20

toki_td

総合スコア2850

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

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

fgfnabwym

2015/07/20 12:56

toki_tdさん、回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問