C++初心者です。ご指導よろしくお願いします。
C++初心者です。ご指導よろしくお願いします。
C++で特定の行の値を読み込むプログラムを作っています。
a.txtとb.txtが入力ファイルで、c.txtが出力ファイルです。
a.txtには
237891
193203
1355876
・
・
・
(以下1~5000000の数値がランダムに15000行分)
b.txtには
0.333333
0.333333
0.397396
・
・
・
(以下0.333333~0.822222までの数値がランダムに5000000行分)
が書いてあって、
c.txtに
a.txtの1行目の数値の行に対応するb.txtの値
a.txtの2~
a.txtの3~
・
・
・
(以下15000行分)
を出力するプログラムを作りたいと思っています。
以下のように、プログラムを書きましたが、a.txtが10行、b.txtが20行程度の時は問題なく動くのですが、行数が多くなると急に動かなくなります。
charのところを変えたり、offsetのところを変えたりしたのですが、最初の1行を読み込んだところで止まってしまいます。
(buffの値は=237891
no2の値は=237891まで)
どのようにすれば動くようになるでしょうか?
ご指導よろしくお願いします。
#include <stdio.h>
#include <iostream>
#include <fstream>
#include <cstdlib>
#include <cstring>
using namespace std;
int main(void)
{
FILE *fp,*fp2,*fp3;
char buff[256],buff2[256];
long int offset[100],offset2[100];
long int max,max2;
long int no=0;
long int no2=0;
for(no=1; no<=15000; no++){
fp = fopen("input/a.txt","r");
if(fp == NULL){
cout << "入力ファイルをオープンできません\n";
}
for ( max = 0 ; !feof(fp) ; max++ ){
if ( max >= 100 ){
break;
}
offset[ max ] = ftell( fp );
fgets( buff, sizeof(buff), fp );
}
fseek( fp, offset[no - 1], SEEK_SET );
fgets( buff, sizeof(buff), fp );
cout << "buffの値は=" << buff << "\n";
no2 = atoi(buff);
cout << "no2の値は=" << no2 << "\n";
fp2 = fopen("input/b.txt","r");
if(fp2 == NULL){
cout << "入力ファイルをオープンできません\n";
}
for ( max2 = 0 ; !feof(fp2) ; max2++ ){
if ( max2 >= 100 ){
break;
}
offset2[ max2 ] = ftell( fp2 );
fgets( buff2, sizeof(buff2), fp2 );
}
fseek( fp2, offset2[no2 - 1], SEEK_SET );
fgets( buff2, sizeof(buff2), fp2 );
cout << "buff2の値は=" << buff2 << "\n";
fp3 = fopen("input/c.txt","a");
if(fp2 == NULL){
cout << "入力ファイルをオープンできません\n";
}
fprintf(fp3, buff2);
strcpy(buff,"0");
strcpy(buff2,"0");
no2=0;
cout << "buff2は初期化されて=" << buff2 << "\n";
fclose(fp);
fclose(fp2);
fclose(fp3);
}
}
補足
さっそくありがとうございます。 A1 ~ A4 に とりたい行数の数値を入れるんですね。 やってみます!