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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ドイ

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

#1

投稿記事 by ドイ » 11年前

こんばんは。
前回のデータ比較の件ではお世話になりました。
ありがとうございます。

今度はファイルストリームを習っているのですが、
データの表示で躓いてしまいました…
擬似アドレス帳プログラムを作っていて
ファイルの読み込みは間違っていないと思うのですが、
いざ表示しようとすると文字化けしてしまいます。
表示の部分に問題があると思うのですが、どこをどう直したらいいのか教えていただけないでしょうか。

以下ソースコードです

コード:

#include <iomanip.h>
#include <fstream.h>

const int Max = 30 ;//アドレス帳に入力可能な最大文字数
const int Ninzu = 5 ;//アドレス帳に登録可能な最大人数

//構造体の宣言
struct Denwa {
	char name[Max]; //名前
	char number[Max]; //電話番号
};

main(){
	cout <<"名前と電話番号しか登録できませんが、アドレス帳プログラムです。" <<endl;
	
	
	ifstream fin("adress.txt" , ios::in);//ファイルストリーム
	if(!fin){ //ファイルオープンに失敗したとき
		cerr<<"ファイルオープンに失敗しました"<<endl;
		exit(1);//プログラムを終了する
	}
	
	Denwa adata[Ninzu];//構造体の変数宣言
	
	//ファイルからデータを読み込む
	for (int i = 0 ; i < Ninzu; i++){
		fin.getline(adata[i].name,Max);
		fin.getline(adata[i].name,Max);
	}
	
	fin.close(); //ファイルを閉じる
		
		//アドレスデータの表示
		cout <<"アドレス帳を表示します"<< endl;
		cout <<"-----------------------------"<<endl;
		
		for (int i = 0 ; i < Ninzu ; i++){
			cout << adata[i].name
			<< adata[i].number <<endl;
		}
		return 0;
}
以下は読み込むテキストファイルの中身です
Miki-Sayaka
09011112222
Sakura-Kyouko
09029299191
Tomoe-Mami
09087654321
Akemi-Houra
08019283847
Kaname-Madoka
09012345678

box
記事: 2002
登録日時: 14年前

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

#2

投稿記事 by box » 11年前

ドイ さんが書きました:

コード:

	//ファイルからデータを読み込む
	for (int i = 0 ; i < Ninzu; i++){
		fin.getline(adata[i].name,Max);
		fin.getline(adata[i].name,Max);
	}
名前を2回読み込んでいて、電話番号を読み込んでいないように見えます。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

アバター
spaaaark・∀・
記事: 66
登録日時: 12年前
住所: 埼玉
連絡を取る:

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

#3

投稿記事 by spaaaark・∀・ » 11年前

コード:

#include <iostream>
using namespace std;
などが記述されてないのはわざとでしょうか…?

それと細かいことかつ関係のない場所なんですが、fstreamヘッダーの関数を使いたい場合、

コード:

#include <fstream.h> // 旧
#include <fstream> // 新
のように、.hをつけない形で記述するようにしてください。#include <iostream.h>と記述しないのと同じです。
これらの書き方(コードの新の書き方)で、標準C++ライブラリにアクセスすることができます。
fstream.hは古いライブラリを参照してしまう場合がありますので注意が必要です。
オフトピック
私の環境(VC++ 2010)では<iomanip>をインクルードしなくてもstd::ios::inは使えました。
<fstream>からかなり奥までソースをたどっていくと、<ios>をインクルードしている部分があったので、それかもしれません。
クリエイティブな生活で刺激的な毎日を!

ドイ

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

#4

投稿記事 by ドイ » 11年前

>>box様
あーーー…こんな初歩的なミスで質問してしまったのですね…
お恥ずかしいです。ありがとうございます。

>>spaaaark・∀・様
すみません、学校で教わっている書き方がこれなので変えることが出来ないんです…
独自で勉強してみると古い書き方なのだなぁということは前々から感じていたのですが
学校の授業を受けている間はどうしてもこの書き方になってしまいます。申し訳ありません。

ドイ

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

#5

投稿記事 by ドイ » 11年前

恥ずかしい質問に答えてくださってありがとうございます(-_-;)
ご指摘していただいたところを直してプログラムの作成を進めていったら、
今度はアドレスデータの書き換えで躓いてしまいました。
データの書き換え事態は行われているようなのですが、
書き換したものを出力するとファイルに新しいデータとムダな空行が発生してしまいます。
これは何故なのでしょうか…。

以下ソースコードです
----------------------------------------------

コード:

#include <iomanip.h>
#include <fstream>

const int Max = 30 ;//アドレス帳に入力可能な最大文字数
const int Ninzu = 5 ;//アドレス帳に登録可能な最大人数

//構造体の宣言
struct Denwa {
	char name[Max]; //名前
	char number[Max]; //電話番号
};

main(){
	cout <<"名前と電話番号しか登録できませんが、アドレス帳プログラムです。" <<endl;
	
	
	ifstream fin("adress.txt" , ios::in);//ファイルストリーム
	if(!fin){ //ファイルオープンに失敗したとき
		cerr<<"ファイルオープンに失敗しました"<<endl;
		exit(1);//プログラムを終了する
	}
	
	Denwa adata[Ninzu];//構造体の変数宣言
	
	//ファイルからデータを読み込む
	for (int i = 0 ; i < Ninzu; i++){
		fin.getline(adata[i].name,Max);
		fin.getline(adata[i].number,Max);
	}
	
	fin.close(); //ファイルを閉じる
		
		//アドレスデータの表示
	cout << " アドレスを表示します\n" <<endl ;
	cout << setw(5) << "番号" << setw(10) << "氏名" << setw(14) << "電話番号" << endl ;
	cout << " ------------------------------" << endl ;
	
	for(int i = 0 ; i < Ninzu ; i++){
		cout << setw(3) << i+1 ;
		cout << setw(15) << adata[i].name 
		<<  setw(13) <<adata[i].number << endl << endl;
	}
	
		
	//変更するか否か
	cout << " 登録情報を変更したい場合は『0』を、\n このまま終了する場合は『1』を半角数字で入力してください >>" ;
	int t ; //選択のための文字
	cin >> t ;
	if(t==0){ //tが0のとき
		int n ; //変更する番号を選ぶための文字
		cout << "\n 登録情報を変更します\n 変更したい番号を入力してください >>" ;
		cin >> n ;
		cout <<"\n 新たに登録するデータを入力してください" << endl ;
		cout <<" 名前 >> " ;
		cin.getline(adata[n-1].name,Max) ;
		cout <<" 電話番号 >> " ;
		cin.getline(adata[n-1].number,Max) ;
		
		//出力ファイルを開く
		ofstream fout("adress.txt",ios::out) ; 
		if(!fout){
			cout << "ファイルがオープンできません" << endl ;
			exit(2) ; //プログラムを終了する(エラー)
		}
		
		//変更したい番号の構造体の中身を変更する
		for(int i = 0 ; i < Ninzu ; i++){
			fout << adata[i].name << endl
			<< adata[i].number << endl ;
		}
		
		fout.close() ; //ファイルを閉じる
		
		//プログラムの終了
		cout << "\n 変更されました" << endl ;
		cout << " プログラムを終了します" << endl ;
	}else if(t==1){ //tが1のとき
		cout << "\n プログラムを終了します\n" << endl ;
		exit(0) ; //プログラムを終了する(正常)
	}
	return 0;
}

ドイ

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

#6

投稿記事 by ドイ » 11年前

なんとか自力で完成させることが出来ました。
ありがとうございました。

閉鎖

“C言語何でも質問掲示板” へ戻る