ページ 11

C++builderのファイル入力について

Posted: 2014年7月31日(木) 14:26
by ツンドラ
enbacadero C++ bullderを用いてVCLアプリケーション開発の勉強をしています。

フォーム上にEdit1とButton1のみを配置し、Button1のオンクリックイベントに以下のようなコードを書きました。

理想とする動作は「csvファイルのファイル名をEdit1に入力し、Button1をクリックすると、csvファイルの1行目が表示される」というものです。

コード:

void __fastcall TForm1::Button1Click(TObject *Sender)
{
	AnsiString filename = Edit1->Text;
	AnsiString str; /*ファイルから文字列をもってくる*/

	filename = ".csv"; /*文字列に.csvを付与する*/

	ifstream fin;
	fin.open(filename.c_str(), ios::in); /*ファイルを読み込み専用でオープン*/

	if( !(fin.fail()) )
	{
		fin.getline(str); /*csvファイルから1行取得 → エラー*/
		ShowMessage(str); 
	}
}
fin.getline(str);で以下のエラーが出ます。
[bcc32 エラー] Unit1.cpp(30): E2285 'istream::getline(AnsiString)' に一致するものが見つからない

ファイルの一行を読み込むという関数でgetlineを採用しました。
getline関数の使い方を間違えているのでしょうか。

アドバイスよろしくお願いします。

Re: C++builderのファイル入力について

Posted: 2014年7月31日(木) 14:51
by ツンドラ
".csv"を付与する場所で構文ミスをしていました。
正しくは以下のコードです。

filename = ".csv";であったのをfilename += ".csv";に直しました。

コード:

void __fastcall TForm1::Button1Click(TObject *Sender)
{
	AnsiString filename = Edit1->Text;
	AnsiString str;

	filename += ".csv";

	ifstream fin;
	fin.open(filename.c_str(), ios::in);

	if( !(fin.fail()) )
	{
		fin.getline(str);
		ShowMessage(str);
	}
}

Re: C++builderのファイル入力について

Posted: 2014年7月31日(木) 15:24
by h2so5
ドキュメントを読みましょう。
http://www.cplusplus.com/reference/stri ... g/getline/
http://docs.embarcadero.com/products/ra ... tring.html

コード:

void __fastcall TForm1::Button1Click(TObject *Sender)
{
    AnsiString filename = Edit1->Text;
 
    filename += ".csv";
 
    ifstream fin;
    fin.open(filename.c_str(), ios::in);
 
    if( !(fin.fail()) )
    {
        string line;
        getline(fin, line);
        AnsiString str(line.c_str());
        ShowMessage(str);
    }
}

Re: C++builderのファイル入力について

Posted: 2014年7月31日(木) 16:36
by ツンドラ
h2so5 さんが書きました:ドキュメントを読みましょう。
http://www.cplusplus.com/reference/stri ... g/getline/
http://docs.embarcadero.com/products/ra ... tring.html

コード:

void __fastcall TForm1::Button1Click(TObject *Sender)
{
    AnsiString filename = Edit1->Text;
 
    filename += ".csv";
 
    ifstream fin;
    fin.open(filename.c_str(), ios::in);
 
    if( !(fin.fail()) )
    {
        string line;
        getline(fin, line);
        AnsiString str(line.c_str());
        ShowMessage(str);
    }
}
ご指摘ありがとうございます。ドキュメントを読んでgetline()には引数が2つ必要なことがわかりました。
僭越ながら改善して頂いたプログラムを実装してみたのですが、やはりgetline()のところで以下のエラーが出ます。

[bcc32 エラー] Unit1.cpp(36): E2268 未定義の関数 'getline' を呼び出した

しっかりインクルードも行っています。エラーの原因はなんなのでしょうか。

コード:

#include <iostream>
#include <string>

Re: C++builderのファイル入力について

Posted: 2014年7月31日(木) 18:30
by h2so5
C++ Builder特有の問題のような気がします。

Re: C++builderのファイル入力について

Posted: 2014年7月31日(木) 18:50
by MoonGate
using namespace std;

が抜けてるせいだと思うんですがね。

Re: C++builderのファイル入力について

Posted: 2014年7月31日(木) 21:22
by Bull
MoonGate さんが書きました:using namespace std;

が抜けてるせいだと思うんですがね。
そうすると、"string" ゃ "ifstream" でもエラーになりそうな気がします。
また、"ifstream" を使うときは <fstream> が必要な気がしますが、
その部分はエラーではないんですよね、不思議ですね。

Re: C++builderのファイル入力について

Posted: 2014年8月02日(土) 21:44
by ツンドラ
h2so5様 MoonGate様 Bull様
コメントありがとうございます。また返信が遅れて申し訳ありません。

学校で使用しているので、また学校でコーディングしてみます。
現状をこちらに書き込みますのでまたアドバイスを頂けると幸いです。

Re: C++builderのファイル入力について

Posted: 2014年8月06日(水) 12:36
by ツンドラ
スレ主です。getline()をC++builderで使いたいということで建てたこのスレッドですが、学校の先生に尋ねてみてもエラーの原因がわからずじまいでした。
アドバイスを下さった方々には申し訳ないのですが、C++builderでgetline()を使うのは諦めて別の手法を取ろうと思います。
そのときはまた質問するかもしないので、見かけた際はまたアドバイスをいただけると幸いです。