仕事を頑張る人のおしりトラブル対策

C++ 初心者です。

以下のような半角スペースと+ 又は - の符号付きの数値データファイル"data"を読み込んで2次元配列に収納するプログラムを教えて頂きたいです。
(アンダーバー"_"で、半角スペースを表します)

___-10.2__20.1_
_30.3___________-50.3___
______3.1____-9.2__

なお、C++の参考書に、「通常の配列はあらかじめサイズを決めて作成しなければならないが、vectorにはメモリが許す範囲でいくつでも要素を追加できる」と書いてあり、この点を活かしたプログラムを作成したいので、最初にデータ数を決めないで、データファイルの最後にくるまで読み込めるようなプログラムにしたいです。

プログラム中で、

for 又は while () {
___________for 又は while() {
______________________cout << "n[" << i << "][" << j << "]= " << n[i][j] << endl;
___________}
}

のように記述して以下のように出力されるようにしたいです。

n[0][0]= -10.2
n[0][1]= 20.1
n[1][0]= 30.3
n[1][1]= -50.3
n[2][0]= 3.1
n[2][1]= -9.2

すみませんが、わかる方がいらっしゃいましたら、宜しくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (3件)

やはり、安直に置き換えるとダメですね。



「配列風」のほうは、こんな感じに修正(出力結果は同じ)
pair を使ったソースも、inner は、while() のループの中で定義した方がいい気がする。


#include <vector>
#include <fstream>
#include <iostream>

int main()
{
std::vector<std::vector<double> > n;

std::ifstream inf("test.txt");

while(1)
{
std::vector<double> inner;
double a;
double b;

inf >> a >> b;
if (inf.eof()) break;

inner.push_back(a);
inner.push_back(b);
n.push_back(inner);
}

for (int i = 0; i < n.size(); i++)
std::cout << "[" << i << "] = " << n[i][0] << ", " << n[i][1] << "\n";

}
    • good
    • 0
この回答へのお礼

すみません、ありがとうございます。
教えて頂いたコードをもとに自分でも幾つか試してみます。

お礼日時:2012/04/29 14:01

例題を見ると、2次元配列というより(2次元配列であるのはその通りですが)


x, y のペアの集まりのような気がします。
この場合、pair の vector というのもありかと思います。
出力結果は、お望みのものとは異なりますが。

----------------------------------------------------------------
#include <vector>
#include <fstream>
#include <iostream>

int main()
{
std::vector<std::pair<double, double> > n;
std::pair<double, double> inner;

std::ifstream inf("test.txt");

while(1)
{
inf >> inner.first >> inner.second;
if (inf.eof()) break;
n.push_back(inner);
}

for (int i = 0; i < n.size(); i++)
std::cout << "[" << i << "] = " << n[i].first << ", " << n[i].second << "\n";

}

----------------------------------------------------------------
配列風にするなら、

#include <vector>
#include <fstream>
#include <iostream>

int main()
{
std::vector<std::vector<double> > n;
std::vector<double> inner;

std::ifstream inf("test.txt");

while(1)
{
inner.clear();

double d;
inf >> d;
inner.push_back(d);
inf >> d;
inner.push_back(d);
if (inf.eof()) break;
n.push_back(inner);
}

for (int i = 0; i < n.size(); i++)
std::cout << "[" << i << "] = " << n[i][0] << ", " << n[i][1] << "\n";

}
    • good
    • 0

dataの中身の文字列を読んで、文字列を解析して数値データ一つのみを文字列として取り出し


n[0][0]から順番に録りだした値をセットする処理を繰り返せばいい
やるべきことは
・ファイルdata読み込み
・文字列解析・数値文字列取り出し
・配列要素設定
の繰り返しです
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。是非検討してみます。

お礼日時:2012/04/29 12:16

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qテキストファイルから文字列を読み込んで二次元配列に格納するには

毎回お世話になっています。

ただいまC言語を勉強中の学生です。

基本的な文法は頭に入れたつもりでしたが、まだポインタと ファイルの入出力に苦手意識があり 実際うまくできないでいるので

どなたか ご存知の方にアドバイスいただければと思って書き込ませていただきます。

今回練習しているのは 先に述べたように、テキストファイルに

abc
def
ghi
jkl

などと文字列を書いておき、そのファイルを読み込んで
二次元配列に格納したいのですが、何を勘違いしているのか、
うまく実現できません。

参考書などを見て 一次元配列へ格納する場合は できたようなのですが、今後このプログラムを発展させる段階で 二次元配列に文字列を
格納できたほうが好都合なので 今模索しています。。。

ちなみに 一次元配列に格納する場合は 以下のように書きました。


#include<stdio.h>
#include<stdlib.h>

main()
{
char a[10];

FILE *fp;

fp = fopen("word.dat", "r");

if (fp == NULL)
{
printf("File does not exist.\n");
exit(1);
}

while(fscanf(fp,"%s",a)==1){
printf("%s\n",a);
}

fclose(fp);

return 0;
}

実はコレに関しても分からない点があり、それは 目的の配列変数
a[]に格納できたのだから それを確認したいと思い
printfで a[0]~a[10]を表示してみようとしたところ 変に文字化け
したものが表示されたり、何も表示されなかったり よく分からないことが起きます。私は何を勘違いしてしまっているのでしょうか(>_<)

長々と書いてしまいましたが、今回 御教授いただきたいのは

(1)、テキストファイルから 英字の文字列を読み込んで二次元配列に格納するために用いるのに 一番最適な関数はどれか(fscanfやfgetsなど) そして、その関数を使って 一番シンプルな記述をするにはどのように記述すればよいのか

(2)、上のようなプログラムの書き方で、配列aにテキストファイルから読み込んで格納できたようなのに、a[0]~a[10]をprintfしたときに
うまく中身が表示されないのはなぜか。

という点なのですが、(1)をとりあえず急いでおりますので、(2)はおまけ程度に考えていただければと思います。

なぜかファイルの入出力がいまだに把握できなくて苦手としておりますので、どうか よろしくお願いいたします。

毎回お世話になっています。

ただいまC言語を勉強中の学生です。

基本的な文法は頭に入れたつもりでしたが、まだポインタと ファイルの入出力に苦手意識があり 実際うまくできないでいるので

どなたか ご存知の方にアドバイスいただければと思って書き込ませていただきます。

今回練習しているのは 先に述べたように、テキストファイルに

abc
def
ghi
jkl

などと文字列を書いておき、そのファイルを読み込んで
二次元配列に格納したいのですが、何を勘違いしているのか、
うまく実現...続きを読む

Aベストアンサー

#include <stdio.h>
int
main(void)
{
char a[10][10];
int i, maxi;
FILE *fin;

if ((fin = fopen("test.dat", "r")) == NULL){
fprintf(stderr, "Can't open file\n");
}
for (i = 0; i<10; i++) {
if (fgets(a[i], 10, fin) == 0) {
maxi = i;
break;
}
}
for (i = 0; i < maxi; i++) {
printf("a[%d] = %s", i, a[i]);
}

fclose(fin);
return 0;
}

QC++で、テキストファイルを一行ずつ読み込んで配列に入れたいのですが、

C++で、テキストファイルを一行ずつ読み込んで配列に入れたいのですが、うまくできません!

テキストには -3.0
       1.0
       2.0

・・・などのように一行に一つの数値が入って縦に並んでいます。
それをひとつずつ読み込み、新しい配列(たとえばa[])に順番にいれたいのです。

a[1]=-3.0,a[2]=1.0、・・・と
なるように。

どうか、この初心者にご指導お願いいたします。

Aベストアンサー

fgetsは文字列として読み込みます。これを数値に変換すれば、とりあえずあなたが望んでいることができます。変換はatofを使います。また、atofを使用するときは#include <stdlib.h>が必要です。
例えば
#include <stdlib.h>
  :
double d;
  :
d=atof("-3.0");
とすると、文字列の-3.0が数値の-3.0に変換されdに入ります。

fscanf関数で読み込んでもできますが、書式とデータがあっていないと上手くいかないので注意してください。

Qカンマ区切りのデータを配列に読み込みたい

趣味でゲームを製作しているのですが、その中で、
マップデータのテキストファイルを二次元配列に読み込むようにしています。
データファイルは、カンマ区切りで、例えば、
1,2,3,4,5
5,4,3,2,1
1,2,3,4,5
というようになっています。

fp=fopen(path,"r");
for(j=0; j<3; j++)
{
for(i=0; i<5; i++)
{
char c;
do{c=(getc(fp));}
while(c==','||c=='\n'||c=='\r');
map[j][i] = c-'0';
}
}

配列の各要素に読み込む中身が、0~9など1文字に限られている場合、このgetc()を使う方法で問題ないのですが、0~255など、文字数がまちまちになると、1文字を取り出すgetc()ではできなくなってしまいます。

これがどうすれば可能になるのか、情けないのですがちょっと思いつかないので、アドバイスを頂ければ幸いです。

Aベストアンサー

少し手を入れたらできそうですね。


{
char c;
do{c=(getc(fp));}
while(c==','||c=='\n'||c=='\r');
//-----------追加-----ここから
// int calc; の宣言要
calc = 0;
do { calc = (c - '0') + (calc*10);}
while(isdigit(c=getc(fp)));
//-----------追加-----ここまで
map[j][i] = calc;
}

QC++でvectorにテキストファイルを読み込む

C++でテキストファイルを読み込んで平均、標準偏差などを表示するプログラムを作っているのですが、
vectorにテキストファイルを読み込ませる方法が分からないので教えていただけないでしょうか?

int型の配列に読み込ませる方法もありますが、テキストファイルのデータ数が未知数のためvectorを使いたいです。

Aベストアンサー

ものごとは正確に認識し正確に表現しましょう。そうでなければプログラミングは出来ません。

>vectorにテキストファイルを読み込ませる
きわめてあいまいな表現です。
これを文字通りに受け止めれば vector<char>にテキストファイルの内容を一文字ずつ読みこむということになりますが、違いますよね?

恐らく、そのテキストファイルには複数の数値が文字表現として記録されていて、その個々の数値をvector<int>(またはvector<double>他)に格納したいということでしょうね?

さて、そのテキストファイルの書式は如何なるものでしょう?
数値と数値の区切りはスペースですか?カンマですか?改行ですか?
これが判らなければソースコードは書けません。

このような詳細は回答者に補足要求される前にご自分で最初から明確にしたうえで質問すべきです。

さて、とりえあえず、テキストファイルには整数値がスペースを区切りとして並んでいる。
それをvector<int>に順に読みこむと言う仕様でサンプルを示します。
ヘッダ、ネームスペースは省略。

vector<int> array;
ifstream file("filename.txt");
int buf;
while ( file >> buf ) array.push_back(buf);

上の解答を書いてる間に質問者から補足がありましたね。
でもまぁ、この回答の趣旨に訂正は必要無いと思いますのでそのままアップします。
ファイル内の区切りがスペースでも改行でもこのサンプルで問題ありません。

ものごとは正確に認識し正確に表現しましょう。そうでなければプログラミングは出来ません。

>vectorにテキストファイルを読み込ませる
きわめてあいまいな表現です。
これを文字通りに受け止めれば vector<char>にテキストファイルの内容を一文字ずつ読みこむということになりますが、違いますよね?

恐らく、そのテキストファイルには複数の数値が文字表現として記録されていて、その個々の数値をvector<int>(またはvector<double>他)に格納したいということでしょうね?

さて、そのテキストファ...続きを読む

QVisual C++によるcsvファイルの読み込みについて

Visual C++を使い始めたばかりの初心者です。
恐縮ながら、Visual C++でのcsvファイルの処理方法についておたずねさせていただければと存じます。
通常のスクリプト言語では、1行読んできて、"," で split をしてやることで、csvファイルを処理できるのですが、Visual C++ではどのようにするのが効率がいいのでしょうか?
csvファイルを簡単に取り扱うことができるようなクラスライブラリが提供されているものなのでしょうか?それとも、1文字1文字、コンマを判定していくのが普通なのでしょうか?

よろしくお願いいたします。

Aベストアンサー

1文字1文字、コンマを判定していくしかないと思います。
下記のプログラムは表面的には一文字ずつ判定していないように見えますがfind()の内部でやっているので同じことです。見えるところで一文字ずつ処理するほうが、きめ細かな処理ができるのでベストではないかと思います。
ライブラリを使うほうが見栄えはいいですが。

#include <iostream>
#include <string>
#include <fstream>
using namespace std;
int main()
{
string col[300][10],row;
int c,r,p;
ifstream f("9437.csv");
if(f.bad()) {
cout << "file not found";
exit(EXIT_FAILURE);
}
r= c = 0;
while(!f.eof() && getline(f,row)) {
for(;(p = row.find(",")) != row.npos;row = row.substr(p + 1)) {
col[r][c] = row.substr(0,p);
cout << col[r][c] << ' ';
c++;
}
col[r][c] = row.substr(0,p);
cout << col[r][c] << endl;
r++;
}
f.close();
}

9437.csv

日付,始値,高値,安値,終値,出来高,逆日歩,貸株残高,融資残高
2009/03/09,141300,142000,137600,138000,104014,-,11754,17458
2009/03/06,146100,146500,141000,141900,121471,-,11843,17170
2009/03/05,150600,150600,147500,147500,117183,-,10530,16623
2009/03/04,149800,150400,148300,149900,75954,-,8452,11718
2009/03/03,149900,151100,149900,150400,66715,-,7694,10549
2009/03/02,151200,152300,150400,152200,53345,-,8589,8984
2009/02/27,152000,153900,150900,153900,86239,-,6503,7793
2009/02/26,150200,151400,150200,151100,69577,-,7676,8884
2009/02/25,152600,153000,149800,150700,90103,-,4440,11015
2009/02/24,150600,151700,150400,151300,60421,-,5055,8724
2009/02/23,153100,154600,151100,151400,98148,-,4745,8072
2009/02/20,154200,156400,153500,153700,60461,-,4225,7061
2009/02/19,152400,156000,152400,154200,70499,-,6211,7119
2009/02/18,151700,153100,150800,152100,49194,-,6310,8019
2009/02/17,154800,155300,151900,153500,50206,-,5369,7714
2009/02/16,150300,155300,150100,155100,79064,-,5131,7281

1文字1文字、コンマを判定していくしかないと思います。
下記のプログラムは表面的には一文字ずつ判定していないように見えますがfind()の内部でやっているので同じことです。見えるところで一文字ずつ処理するほうが、きめ細かな処理ができるのでベストではないかと思います。
ライブラリを使うほうが見栄えはいいですが。

#include <iostream>
#include <string>
#include <fstream>
using namespace std;
int main()
{
string col[300][10],row;
int c,r,p;
ifstream f("9437.csv");
if(...続きを読む

QLNK2019: 未解決の外部シンボルのエラーが出る

Microsoft Visual Studio 2008
Version 9.0.21022.8 RTM
Microsoft .NET Framework
Version 3.5 SP1
----------------------------------------------------------------
新しいプリジェクト→Win32 コンソール アプリケーション(ソリューションのディレクトリを作成 チェック外す)→Windows アプリケーション(空のプロジェクト チェック外す)
----------------------------------------------------------------
 プログラム

 mymain.cpp
#include "myhelper.h"
#include "mymain.h"

//自キャラのデータ
Point2D g_jikipos = {40, 400};//自キャラの座標

//画像ハンドル
int g_jikiimage[11];

//色々なファイルの読み込み
int LoadFiles(){
//画像ファイル読み込み
if(LoadDivGraph("media\\player01.bmp",
11,11,1,64,64,g_jikiimage) == -1) return -1;

return 1;
}


 mymain.h
//他から呼び出させるMyMainの関数
void MyMain();
int LoadFiles();


 myhelper.h(サンプルなので打ちミスはない)
#include "DxLib.h"
#include <limits.h>
#include <math.h>

//構造体宣言
//座標またはベクトルを記録する構造体
struct Vector{
float x,y;
};
typedef Vector Point2D;
//線を記録する構造体
struct Line2D{
Point2D startpos, endpos;
float katamuki;//傾きをラジアン値で記録
Vector speed;//移動している場合は速度をセット
};
//球体を記録する構造体
struct Ball2D{
Point2D position;
float hankei;//半径
};
//四角形を記録する構造体
struct Rect2D{
Point2D lefttop;
Point2D rightbottom;
float width;
float height;
};


//ライブラリ関数
Point2D PosInView(Point2D in);
int XInView(float inx);
int YInView(float iny);
void ScrollToLeft(float jikiposx);
void ScrollToRight(float jikiposx);
void ScrollToUp(float jikiposy);
void ScrollToDown(float jikiposy);
void DrawLineInView(float x1, float y1, float x2, float y2, int Color, int Thickness);
void DrawCircleInView(float x, float y, float r, int Color, int FillFlag);
void DrawAnimation(float x, float y, double ExtRate, double Angle,int TurnFlag,
int *imgarray, int allframe, float fps);
//ベクトル関数
Vector CreateVector(Vector in, float veclen);
Vector AddVector(Vector v1, Vector v2);
Vector SubVector(Vector v1, Vector v2);
Vector AddVectorInFrameTime(Vector pos, Vector speed);
Vector AddVectorInFrameTime2(Vector pos, Vector speed, Vector accel);
Vector Normalize(Vector in);
Vector RotateVector(Vector in, float radian);
float VectorLengthSquare(Vector in);
float DotProduct(Vector v1, Vector v2);
float CrossProduct(Vector v1, Vector v2);
void SetLine2DKatamuki(Line2D *in);
void DrawLine2D(Line2D in, int Color, int Thickness);
void DrawBall2D(Ball2D in, int Color, int Fill);
//当たり判定関数
bool HitTestLineAndBall(Line2D linein, Ball2D ballin);
bool IsPointAtLineFace(Line2D linein, Point2D ptin);
bool HitTestLineAndLine(Line2D line1, Line2D line2);
bool HitTestBallAndBall(Ball2D a, Ball2D b);
bool HitTestPointAndBox(Rect2D rect, Point2D pt);
//タイマー関数
void SetSimpleTimer(int idx, int time);
int GetPassedTime(int idx);


//グローバル変数
extern float g_frametime;
extern Rect2D g_framerect;//画面領域(当たり判定)
extern Point2D g_current_field_pos;//現在の左上座標
extern Rect2D g_stagesize;//ステージサイズ

//定数宣言
const float ZEROVALUE = 1e-10f;
const float PIE = 3.1415926f;
const int SCROLL_LIMIT = 200;
----------------------------------------------------------------
 エラー内容
1>myhelper.obj : error LNK2019: 未解決の外部シンボル "void __cdecl MyMain(void)" (?MyMain@@YAXXZ) が関数 _WinMain@16 で参照されました
1>C:\Documents and Settings\Owner\My Documents\Visual Studio 2008\Projects\my\Debug\my.exe : fatal error LNK1120: 外部参照 1 が未解決です
1>my - エラー 2、警告 0
ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ
----------------------------------------------------------------
画像を貼り付けときます
(見えにくい場合→http://www.dotup.org/uploda/www.dotup.org154142.jpg.html)
初心者なのでわかりやすくお願いします

Microsoft Visual Studio 2008
Version 9.0.21022.8 RTM
Microsoft .NET Framework
Version 3.5 SP1
----------------------------------------------------------------
新しいプリジェクト→Win32 コンソール アプリケーション(ソリューションのディレクトリを作成 チェック外す)→Windows アプリケーション(空のプロジェクト チェック外す)
----------------------------------------------------------------
 プログラム

 mymain.cpp
#include "myhelper.h"
#include "mymain.h"

//自...続きを読む

Aベストアンサー

ファイル構成から推測するに
mymain.cpp というファイルに
void MyMain(void) {
// ここに処理を書く
}
という関数が必要なようです。

QSTLで、vectorのファイルへの書き出し、読み込み。

STLで、vectorのファイルへの書き出し、読み込み。

C++ の STL で vector をファイルに書き出し、読み込もうとしておりまして、まずは書き出しで躓いております。

vector<int> testvector;
for (i = 0 ; i < 10 ; i++)
testvector.push_back( i );
ofstream out("test.dat", ios::out | ios::binary);
if (!out) return 1;
out.write((vector<int>) testvector, sizeof(testvector));
out.close();

こんな感じのコードですと、

error: no matching function for call to ‘std::basic_ofstream<char, std::char_traits<char> >::write(std::vector<int, std::allocator<int> >, long unsigned int)’
/usr/include/c++/4.2.1/bits/ostream.tcc:173: note: candidates are: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::write(const _CharT*, std::streamsize) [with _CharT = char, _Traits = std::char_traits<char>]

とのことです orz. どのようにすれば vector を書き出し、そして読み込むことができるのでしょうか。情報がありましたら是非お寄せください。

STLで、vectorのファイルへの書き出し、読み込み。

C++ の STL で vector をファイルに書き出し、読み込もうとしておりまして、まずは書き出しで躓いております。

vector<int> testvector;
for (i = 0 ; i < 10 ; i++)
testvector.push_back( i );
ofstream out("test.dat", ios::out | ios::binary);
if (!out) return 1;
out.write((vector<int>) testvector, sizeof(testvector));
out.close();

こんな感じのコードですと、

error: no matching function for call to ‘std::basic_ofstream...続きを読む

Aベストアンサー

#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

int main() {
vector<int> testvector;

for (int i = 0 ; i < 10 ; i++)
testvector.push_back( (i+1)*100 );

ofstream out("test.dat", ios::out | ios::binary);
if (!out) return 1;

int count = testvector.size();
out.write(reinterpret_cast<const char*>(&count), sizeof(count));
out.write(reinterpret_cast<const char*>(&testvector[0]), testvector.size() * sizeof(int));
out.close();

testvector.clear();
count = 0;

ifstream in("test.dat", ios::in | ios::binary);
if ( !in ) return 1;
in.read(reinterpret_cast<char*>(&count), sizeof(count));
testvector.assign(count, 0);
in.read(reinterpret_cast<char*>(&testvector[0]), testvector.size() * sizeof(int));
in.close();

for ( int i = 0; i < testvector.size(); ++i )
cout << testvector[i] << endl;
}

#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

int main() {
vector<int> testvector;

for (int i = 0 ; i < 10 ; i++)
testvector.push_back( (i+1)*100 );

ofstream out("test.dat", ios::out | ios::binary);
if (!out) return 1;

int count = testvector.size();
out.write(reinterpret_cast<const char*>(&count), sizeof(count));
out.write(reinterpret_cast<const char*>(&testvector[0]), testvector.size() * sizeof(int));
out.close();...続きを読む

Qファイルから読みこむ方法

Unix C++でファイルから、特定の行を読みこむことは可能でしょうか。
例えば、5行目から最後の行まで。10行目から20行目。等。

Aベストアンサー

 CやC++には、テキストファイルから指定した行を読み込むという関数は用意されていません。
 ですので、ファイル先頭から行単位で読んでいき、読んでいる行数を変数でカウントしながら、目的の行だけ配列に入れるなどの処理を行うことになります。

 行単位の読み込みは、istream系オブジェクトに用意されたgetlineメソッドで行えばよいでしょう。

#include <iostream.h>
#include <fstream.h>

int main(void)
{
  ifstream fin;
  int s = 10;   // 先頭からなら 1 を指定する
  int e = 20;   // 末尾までなら -1 を指定する
  const int bufsize = 256;
  char buf[bufsize];

  fin.open("xxx", ios::in | ios::nocreate);
  if (fin.fail()) {
    cerr << "ファイルを開けません\n";
    return 1;
  }
  for (int i = 1; i < s; i++)   // 読み飛ばし
    fin.getline(buf, bufsize);
  for (int i = s; i<=e || (e==-1 && !fin.eof()); i++) {
    fin.getline(buf, bufsize);
    cout << buf << endl;
  }
  fin.close();

  return 0;
}

 ところで、これまでの回答には何の補足もお礼もありませんが、解決はしたのですか?未解決なら分からないところを書かないと、新しい回答は書きにくいものですよ。

 CやC++には、テキストファイルから指定した行を読み込むという関数は用意されていません。
 ですので、ファイル先頭から行単位で読んでいき、読んでいる行数を変数でカウントしながら、目的の行だけ配列に入れるなどの処理を行うことになります。

 行単位の読み込みは、istream系オブジェクトに用意されたgetlineメソッドで行えばよいでしょう。

#include <iostream.h>
#include <fstream.h>

int main(void)
{
  ifstream fin;
  int s = 10;   // 先頭からなら 1 を指定する
...続きを読む

Qファイル出力の場所を指定

現在C++にてhtmlファイルを出力するプログラムを作っているのですが、出力場所を指定することはできるのでしょうか?(現在はそのプログラムソースが保存されている場所と同じファイル内に出力されますが、それをデスクトップに出力するなど。)
もし、方法がありましたら、教えてください。
ソースや参考HPのURLなどのせていただけたらありがたいです。
環境はVisualStudio.NET2003です。
よろしくお願いします。

Aベストアンサー

単にファイル名の前にパスを指定する。

絶対パス指定
fp=fopen("c:/temp/test.txt","w");

相対パス指定
fp=fopen("./hoge/test.txt","w");


デスクトップはOSやユーザによって場所が異なるので、少し面倒です。
XPの場合環境変数を利用してこんな感じで出来ると思います。

例:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void main(void)
{
FILE *fp;
char fname[1024];
strcpy(fname,getenv("USERPROFILE"));
strcat(fname,"/デスクトップ/test.txt");
fp=fopen(fname,"w");
//処理
fclose(fp);
}

Q数字の入った配列をファイルへ出力。

今、hist[256]というint型の配列に数字が入っているとします。
これを、テキストファイルに出力して、

0
242
5654
232
3123
756



こんな感じで、ファイルに出力したいです。

文字としての出力になるのでhist[256]配列を、int型からchar型に変換しないとダメでしょうか?
また、変換するとしたら、char型だと unsigned char にしても 0~256の値までしか1つの配列に保存できませんよね?
もっと大きい数字も入っているので何とかする方法も教えて下さい。

初歩的な質問で申し訳ありませんが、よろしくお願いします。

Aベストアンサー

fprintf()関数を使えば簡単です。
簡単に言えば、printf()関数のファイル出力版です。
画面ではなく、ファイルに文字列を出力します。

サンプル
------------------------
FILE *fp;
int i;
if((fp = fopen("data.txt", "w")) != NULL){
 for(i = 0; i < 256; i++){
  if(fprintf(fp, "%d\n", hist[i]) < 0){
   //書き込みエラー
   break;
  }
 }
 fclose(fp);
}else{
 //ファイルオープンエラー
}
------------------------

%d で int型の整数を文字として表示、
\n で改行です。printf()関数と同じですね。

#サンプルはインデントに全角スペースを使っています。

-----------------------------------------------------------
>int型からchar型に変換しないとダメでしょうか?
>また、変換するとしたら、char型だと unsigned char にしても 0~256の値までしか1つの配列に保存できませんよね?

ちょっと勘違いしているようなので、説明しますが・・・

C言語の文字列は、文字の配列です。
char型は1文字を表わします。
文字列は、char型の配列になります。

例えば、整数の 123 を文字列で表現する場合、
文字数は3文字で、終端にヌル文字('\0')が入りますので、
4文字の配列になります。

unsigned char c[] = {'1','2','3','\0'};

一つ一つは文字コード(0~255)ですので、char型で問題ありません。

fprintf()関数を使えば簡単です。
簡単に言えば、printf()関数のファイル出力版です。
画面ではなく、ファイルに文字列を出力します。

サンプル
------------------------
FILE *fp;
int i;
if((fp = fopen("data.txt", "w")) != NULL){
 for(i = 0; i < 256; i++){
  if(fprintf(fp, "%d\n", hist[i]) < 0){
   //書き込みエラー
   break;
  }
 }
 fclose(fp);
}else{
 //ファイルオープンエラー
}
------------------------

%d で int型の整数を文字として表示、
\n で...続きを読む


人気Q&Aランキング

おすすめ情報