• 締切済み

ファイルを読み込んで入力する方法

C++についての質問です。 あるファイル(テキストでもエクセルでもCSVでも可)に書かれている数値を読み込んで、プログラム内で入力する方法が知りたいです。 例えば、"test.txt"というファイルに 1 2 3 4 5 3 2 3 1 2 というような数字の羅列があった場合に、プログラムのmain関数内の {x1[0],x2[0],x3[0],x4[0],x5[0]} {x1[1],x2[1],x3[1],x4[1],x5[1]} のような場所に、順番に入れて行きたいです。 "a.txt"の中の1行目を左から順にx1[0],x2[0],x3[0],x4[0],x5[0]に入力し、次に2行目を同じく左から順に・・・というように、"a.txt"ないの行数だけ入力していけるプログラムを考えています。 どなたかご教授していただけないでしょうか。 拙い文章で申し訳ありません。

みんなの回答

回答No.1

・入力は必ずint型なのか? ・入力の列数は必ず5なのか? などなど、どのような形式を読めるようにするのかで、 複雑さが違ってきます。 とりあえず、 ・入力は必ずint型 ・入力の列数は必ず5 で質問の通りx1[],x2[],x3[],x4[],x5[]に入力するならこんな感じでもいい・・。 #define MAX_LINE_SIZE 1024 int i,len; FILE *fp; char buff[MAX_LINE_SIZE]; int *x1, *x2, *x3, *x4, *x5; fp = fopen("a.txt","r"); if(NULL == fp){ //エラー処理 } for(len = 0; fgets(buff, MAX_LINE_SIZE, fp) != NULL; len++); x1 = (int *)malloc(sizeof(int) * len); if(NULL == x1){ //エラー処理 return; } x2 = (int *)malloc(sizeof(int) * len); if(NULL == x2){ //エラー処理 return; } x3 = (int *)malloc(sizeof(int) * len); if(NULL == x3){ //エラー処理 } x4 = (int *)malloc(sizeof(int) * len); if(NULL == x4){ //エラー処理 } x5 = (int *)malloc(sizeof(int) * len); if(NULL == x5){ //エラー処理 } fseek(fp, 0L, SEEK_SET); for(i = 0; i < len; i++){ fscanf(fp, "%d %d %d %d %d", &x1[i], &x2[i], &x3[i], &x4[i], &x5[i]); printf("%d %d %d %d %d",x1[i], x2[i], x3[i], x4[i], x5[i]); } free(x1); free(x2); free(x3); free(x4); free(x5); fclose(fp); csvフォーマットのほとんどに対応するなら、かなり面倒です。 その場合は全く違うソースになります。 C++とのことですが、とりあえずCで・・。

関連するQ&A

  • csvファイルの特定のセルから読み込み

    C++についての質問です。 あるファイル(テキストでもエクセルでもCSVでも可)に書かれている特定のセル数値(整数)を読み込んで、プログラム内で入力する方法が知りたいです。 例えば、"test.txt"というファイルに 1 2 3 4 5 3 2 3 1 2 というような数字の羅列があった場合に,2行目4列目のセルの値を読み込む プログラムは、どうのうにすればできるでしょうか?

  • ファイル入力方法(C言語)

    C言語のファイル入力について教えてください。 入力ファイルinput.txtが以下である時、 *********** abcdefg *********** 2 3 5 6 3 8 1 7 ●最初の3行を無視する ●4行目以降の数値を配列に格納し、表示する (4行目以降は2列で固定、行数は最大100列) 以上の条件でプログラムを作成したいのです。 最初の3行がない入力ファイルinput2.txt 2 3 5 6 3 8 1 7 を入力し、表示するソースコードは以下のように作成できましたが、「最初の3行を無視する」方法が分かりません。 お手数ですが、ご存じの方教えてください。 よろしくお願いいたします。 #include <stdio.h> #include <stdlib.h> int main() { int i,N,a[100],b[100]; FILE *fpi; if((fpi=fopen("input2.txt","r"))==NULL) { fprintf(stderr,"ファイルを開けません\n"); exit(1); } for (N=0; N<100 && fscanf(fpi,"%d %d",&a[N],&b[N]) != EOF; N++); printf("データ行数:%d\n\n",N); for(i=0;i<N;i++) { printf("%d %d\n",a[i],b[i]); } fclose(fpi); return 0; }

  • c++ 入力、出力まわりについて

    Mac OSX 10.7.3です。 c++で書いたプログラムをコンパイルして以下のような数字の集まりを上の行から順に入力したいです。 このプログラムはこの数字列の値により出力をするものとします。 3 3 6 100 2 64 main.cppというコードを使っていて上の数字を保存した input.txtというファイルがあり、output.txtという出力ようのファイルがDesktop下にあります。 ここでターミナルで cd Desktop/ g++ -Wall main.cpp ./a.out < input.txt > output.txt とリターンしてもうまくoutput.txtに出力されません。

  • ファイル入力方法

    いつもお世話になります。C言語のファイル入力について教えてください。 入力ファイルinput.txtの内容が以下の時、 ----------- abcdefg ----------- 2 3 5 6 3 8 1 7 ----------- ABCDEFG ----------- (1)最初の3行を無視する (2)4行目からの数値データを配列に格納する (3)数値データは最大100行、2列固定 (4)8行目の-----------以降は無視する 以上の条件でプログラムを作成したいのです。(1)(2)(3)の条件は下記のソースコードに入っていますが、(4)の処理の仕方がわかりません。 申し訳ありませんが、教えてください。よろしくお願いします。 #include <stdio.h> #include <stdlib.h> int main() { int i,cnt=0,N=0,a[100],b[100]; char s[256]; FILE *fpi; if((fpi=fopen("input.txt","r"))==NULL){ fprintf(stderr,"ファイルを開けません\n"); exit(1); } while(fgets(s,256,fpi) != NULL){ //printf("%s",s); cnt++; if(cnt>3){ sscanf(s,"%d %d",&a[N],&b[N]); N++; } } printf("データ行数:%d\n\n",N); for(i=0;i<N;i++){ printf("%d %d\n",a[i],b[i]); } fclose(fpi); return 0; }

  • ファイル入力の仕方

    下記のような入力ファイル(input.txt)を配列に格納するプログラムを作成しています。 下のソースコードは行数・列数が一定の場合のものですが、実際の入力データは行数・列数とも不定です。つまり、行数・列数をプログラムで読み取らなければなりません。この場合、ソースコードをどのようにすれば良いのでしょうか? 大変お手数ですが、教えてください。よろしくお願いします。 x y1 y2 y3 y4 10.0 1.2 1.5 1.0 2.1 10.5 1.3 1.4 1.2 2.2 11.0 1.8 1.2 2.2 3.1 11.5 2.1 1.0 1.2 4.5 12.0 1.9 1.1 1.1 5.5 13.0 2.4 1.1 2.1 4.2 ・1行目をchar型配列に格納したい。 ・2行目以降はdouble型配列で1列目をX[]、2列目以降をY[][]に格納したい。 ・行数は20(2行目以降)まで、列数は10(2列目以降)まで #include <stdio.h> #include <stdlib.h> int main(){ int i,j; double X[20],Y[20][4]; char x[2],y[10][4]; FILE *fpi; if((fpi=fopen("input.txt","r"))==NULL){ fprintf(stderr,"Cannot open file.\n"); exit(1); } fscanf(fpi,"%s %s %s %s %s",x,y[0],y[1],y[2],y[3]); printf("%s %s %s %s %s\n",x,y[0],y[1],y[2],y[3]); for(i=0;i<6;i++){ fscanf(fpi,"%lf",&X[i]); printf("%4.1lf ",X[i]); for(j=0;j<4;j++){ fscanf(fpi,"%lf",&Y[i][j]); printf("%4.1lf ",Y[i][j]); } printf("\n"); } printf("\n"); return 0; }

  • 複数CSVファイルからデータ抽出

    CSVファイルのA列(行は問いません)の文字が転記シートのA列(行は問いません)と一致していたら、転記シートのA列が一致した行の空白に、左から順にCSVファイルのA列が一致した行のF列の値を書き込む。CSVファイルの1行A列を転記シートのF列の値を書き込んだ列の1行目に書き込む。 できれば、書き込んだ値はCSVファイルから消したいです。 コピペでやっていたのですが、ずれていてどうしようもなくなりました。 CSVファイル一つ当たり、4000行ほどあり、ファイルは200弱あります。 プログラムを組んでくださると、ありがたいのですが。 質問というよりお願いになってしまいますが、よろしくお願いします。

  • FORTRAN ファイルの入出力の方法がわかりません

    メインプログラムを main.dat 入力するファイルを input.txt とします。 input.txtファイル内は A 12 23 B 49 93 C 66 25 ・ ・ ・ と続いてるとします。(数字は同じ数ずつ並んでて、その間にアルファベットがある) この時、2行目~3行目(12と23)、5行目~6行目(49と93)、8行目~9行目(66,25)、・・・・、とそれぞれのアルファベットのグループの数字を読み込んで、別々の出力ファイルを作るにはどうすれば良いかわかりません。つまり ファイルA 12 23 ファイルB 49 93 ファイルC 66 25 ファイルD ・ ・ ・ とアルファベットのグループ毎にファイルを作りたいのです。 DO文だけでできるのか?また、IF文を使う必要があるのか?直接アクセス入力(ACCESS='DIRECT')を使うのか?初心者でかなり調べたんですがよくわかりません。教えて頂けると幸いです。よろしくお願いします。 また、もしよろしければ、グループCのみの数字(66、25)だけを読み込んで、出力する場合についても教えてくれるとありがたいです。 (基本的なOPEN、READ、WRITE文の使い方はわかっています。)

  • CSVファイルを複数のファイルに分割する方法

    CSVファイルの最初の数行を飛ばして、同じ行数ずつ分割して1.csv、2.csv・・・という風に分けたいのですが、行数が膨大で手作業でするにも時間がどのくらいかかるのか分かりません。どなたか簡単な方法を教えてください。

  • ファイルを分割する。

    ひとつのファイルを3つのファイルに分けて保存するプログラムを作りたいと思います。 ファイル名 test.txt 内容 あああ いいい ううう かかか ききき くくく さささ ししし すすす というファイルを指定した行数ごとに違う名前で保存できるようにしたいのです。 SEEKとかでは指定した行では分けれないし、foreachではすべての行になってしまいます。 ファイル名 1.txt あああ いいい ううう ファイル名 2.txt かかか ききき くくく という感じで分けたいと思います。 よろしくお願いします。

    • ベストアンサー
    • Perl
  • csvファイルの読込みとソート

    いつも大変参考にさせていただいております。 csvファイルの読み込みとソートをしたく、ネットや過去ログ等を相当調べたのですが、完全に詰まってしまいました。 (検索キーワード:「php csv ソート」「php 二次元配列 ソート」など) とても困っています。どなたかよろしくお願いします。 以下のようなcsvファイルを読み込みソートしたいのです。 ■csvファイル 20110803, A, りんご 20111215, B, みかん 20110306, A, みかん 20110620, A, りんご 20110215, B, りんご ■個別にやりたい処理 (1)、左列の日付で昇順ソートしてすべて表示 (2)、「A」を含む行をすべて表示(日付順) (3)、「A」+「りんご」を含む行をすべて表示(日付順) □補足 csvをfgetcsvで読み込み、テーブルに入れて表示するところまではできました。 csvの行は増えていきます(max100行位)。列は固定。

    • ベストアンサー
    • PHP