プロが教えるわが家の防犯対策術!

CとC++での並びによる入出力についてお尋ねします。

1.2 3.2 4.5
0.4 2.1 3.2
4.1 3.2 1.5
9.1 2.5 2.1

というようなエクセルのシートのような状態になっている数値のファイルがあります。
(この例は4x3ですが、200x100程度です。)
数値の切れはカンマか空白かですが基本空白です。

このようなファイルへの入出力についてどのような処理になるでしょうか。
Fortranだと書き込みは以下のような感じで至極簡単です。
(縦、横方向にループが回って1つ1つ読み書きしているイメージです。)

---以下を想定
配列 fの宣言
nx=3
ny=4
---

open(10,file='xxx')
do j=ny,1,-1
write(10,*) (f(i,j),i=1,nx)
enddo
close(10)

読み込みについてはwrite→readにすればいいです。

読み書きする場合、1つ1つの数値のフォーマットの問題があるでしょうか。fortranは指定しなければデフォルトでの読み書きとなり、普通書き込む場合は1.242e+5, ±1.24236など指定した方が見やすくはなりますが。

これのC, C++版です。CとC++はだいぶ違うかもしれませんけれども。

よろしくお願いします。

A 回答 (3件)

>fscanf( fp1,"%lf %lf %lf", &arr[i][0],&arr[i][1],&arr[i][2]);


は、変数が3個の場合に限定されていると思います。
>これが100とか多い場合1000とかの場合はどうなるでしょうか。
>fortranの場合、
>read(10,*) (f(i,j),i=1,nx)
>においてnxの値を1000にしておけばいいですし、何個であってもそれに体操してnxを変えるだけです。
>2次元配列なので、ループが2方向となります。2つの方向へのループ回数を指定するだけで済むという読み書きなのですが。
>いかがでしょうか。

提示したサンプルが悪かったかもしれません。
以下のソースでも、同じ結果が得られます。
------------------------------------------------------
#include<stdio.h>
#include<stdlib.h>
int main(void)
{
FILE *fp1, *fp2;
double arr[4][3];
int i,j;
if( (fp1 = fopen( "in_data27.txt", "r")) == NULL ) {
printf("入力ファイルをオープンできません\n");
return 10;
}
if( (fp2 = fopen( "out_data27.txt", "w")) == NULL ) {
printf("出力ファイルをオープンできません\n");
return 10;
}
for(i = 0;i < 4;i++){
for(j = 0; j < 3; j++){
fscanf( fp1,"%lf ", &arr[i][j]);
}
}
for(i = 0;i < 4;i++){
for(j = 0; j < 3; j++){
fprintf(fp2,"%f ",arr[i][j]);
}
fprintf(fp2,"\n");
}
fclose(fp1);
fclose(fp2);
return 0;
}
---------------------------------------------------
100×100の場合は
for(i = 0;i < 100;i++){
for(j = 0; j < 100; j++){
fscanf( fp1,"%lf ", &arr[i][j]);
}
}
のようになります。
C言語の場合は
3つ一度に読む方法もありますし、1つずつ読む方法もあるということになります。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。大変助かりました。
読み込みの方はフォーマットを%lf指定して、自然にループを回し、
書き込みの方はフォーマットは%fで、改行付きでループを回す、
という風に覚えようと思います。

お礼日時:2016/12/07 08:43

ちなみに C++ だと istream_iterator (または ostream_iterator) を使ってやるのがよいかと. まじめに考えてないけど, 努力と根性で工夫すると


どっちも 1行でできる
かもしれん.
    • good
    • 0

以下が、in_data27.txtのファイルからデータを読み込み、読み込んだ値をout_data27.txtへ


出力するプログラムです。
in_data27.txtは4行3列のデータが格納されています。
---------------------------------------------
#include<stdio.h>
#include<stdlib.h>

int main(void)
{
FILE *fp1, *fp2;
double arr[4][3];
int i;
if( (fp1 = fopen( "in_data27.txt", "r")) == NULL ) {
printf("入力ファイルをオープンできません\n");
return 10;
}
if( (fp2 = fopen( "out_data27.txt", "w")) == NULL ) {
printf("出力ファイルをオープンできません\n");
return 10;
}
for(i = 0;i < 4;i++){
fscanf( fp1,"%lf %lf %lf", &arr[i][0],&arr[i][1],&arr[i][2]);
}
for(i = 0;i < 4;i++){
fprintf(fp2,"%f %f %f\n",arr[i][0],arr[i][1],arr[i][2]);
}
fclose(fp1);
fclose(fp2);

return 0;
}
-------------------------------------------------------
in_data27.txtの内容
1.2 3.2 4.5
0.4 2.1 3.2
4.1 3.2 1.5
9.1 2.5 2.1

out_data27.txtの内容
1.200000 3.200000 4.500000
0.400000 2.100000 3.200000
4.100000 3.200000 1.500000
9.100000 2.500000 2.100000
    • good
    • 0
この回答へのお礼

回答ありがとうございます。サンプルまで表示頂きました。
この中で、
fscanf( fp1,"%lf %lf %lf", &arr[i][0],&arr[i][1],&arr[i][2]);
は、変数が3個の場合に限定されていると思います。
これが100とか多い場合1000とかの場合はどうなるでしょうか。

fortranの場合、
read(10,*) (f(i,j),i=1,nx)
においてnxの値を1000にしておけばいいですし、何個であってもそれに体操してnxを変えるだけです。
2次元配列なので、ループが2方向となります。2つの方向へのループ回数を指定するだけで済むという読み書きなのですが。

いかがでしょうか。

お礼日時:2016/12/04 21:02

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