- ベストアンサー
1行ずつではなくまとめてファイル出力したいのですが
Cは初心者です。というかプログラム自体ずぶの素人です。 パラメーター1パラメーター2パラメーター3を使って計算をし、結果として パラメーター1,パラメーター2,パラメーター3,数値2,数値3,数値4,数値5,数値6,数値7 というような形式で1行ファイル出力をし、 パラメーターを変えて(for文)またファイル出力をし、とかなりの回数繰り返す計算をしております。 (元々AWKで動いていた自作プログラムの移植です) 現在、 #include <fstream> ofstream file1("c:\\data.csv",ios_base::app |ios_base::out) ; file1 << parameter1 << "," << parameter2 << ~中略~ << "," << value1 << "," << value2 << "," << ~中略~ "\n" ; のようにファイル出力しているのですが、ファイルサイズがでかくなってくると、もの凄く遅くなります。 ひょっとして、ファイルオープン→ファイル末尾まで開く→1行書き込む→ファイルクローズ→ の繰り返しで、だからファイルが大きくなると遅くなるのではないかという気がしているのですが、 何行も(1000行とか1万行とか5万行とか)一気に出力する方法はないでしょうか? まず、どうやってデータを溜め込み、次にどういう出力方法があるのか、教えていただけないでしょうか。 parameter1~Value7(本当は倍以上ありますが)をそれぞれ全て配列にし、ファイルをオープンして閉じずにfor文で書き込む、なんてのも考えたのですが、どうしたら良いか判らずギブアップです。 もうちょっとスマートに、file1のところを配列にするとか、file1にどんどんデータを書き加えて巨大な一文にしてしまうとか、何か方法はないでしょうか? なお、cはマイクロソフトが只で配っているVisual Studio の VisualC++ Express Editionを、よく判らないまま使用しております。 先週ダウンロードしましたので、おそらく最新版だと思います。 ポインタの辺りは、理屈は解りましたがスラスラ使いこなせるということはなく、他人のソースを見てもよく判らない状態です。 というか、どこまで書き換えて良い文字で、どこまでが標準関数(?)等の書き換えられない文字かもよく解っていないレベルです。 よろしくお願いいたします。
- みんなの回答 (4)
- 専門家の回答
関連するQ&A
- ファイルの3行目までを出力したい
Perl初心者です。 test.txtというファイルがあって、その中の1行目から3行目までを 出力したい場合はどうしたらいいでしょうか? open(FILE,"test.txt") || die "Open Error.\n"; @data = <FILE>; close(FILE); foreach (@data) { print $_; } これだと、ファイルの中身が全て出力されてしまいます。
- ベストアンサー
- Perl
- CSVの出力(1行を3行に出力~)
テキスト式1行 200705 00001 A01 A02 B01 B02 C01 C02があるとします。 200705と00001は3行の先頭を出したいので、どうやってループさせたらいいのかわからないのです。 今の状況 Private Sub Object(lFname As String, lOFilename As String) Dim IUO As Variant ''出力データ Dim lFBnt As Long ''開始位置1 Dim m_Input As String ''レコード退避先データ Dim byteInput() As Byte ''領域確保変数 Dim fs As Object ''ファイルシステムオブジェクト Dim ObjOutFile As Object ''出力先ファイルオブジェクト'' IUO = "" ''出力先ファイルオブジェクトの作成 Set fs = CreateObject("Scripting.FileSystemObject") ''出力先ファイル名の指定 Set ObjOutFile = fs.CreateTextFile(lOFilename, True) ReDim byteInput(レコードの長さ- 1) ''正常ファイル時のファイルオープン Open lFname For Binary As #1 '' ファイルの終端までループを繰り返します。 Do While Loc(1) < LOF(1) IUO= "" ''該当行のレコードデータの取得 Get #1, , byteInput m_Input = StrConv(byteInput, vbUnicode) lFBnt = 1 IUO = IUO + Chr(39) & MidMbcs(m_InputBuffer, lFBnt, 一つ目のパラメータ名) + Chr(39) lFBnt = lFBnt + 一つ目のパラメータ名 IUO = IUO + vbNewLine ''改行 ''ファイルへの書込 ObjOutFile.Write (IUO) Me.Refresh Loop Close #1 ''File close ObjOutFile.Close Set ObjOutFile = Nothing End Sub 以上では1行しか出力できないのですが、どうやったら3行出力できるのでしょうか。 よろしくおねがいします。
- 締切済み
- Visual Basic
- c++ 出力ファイル名
c++ 初心者 です。fortran 77fortran 90でしたら幾分わかります。 c++ のプログラムで、for 文やwhile文の中に出力させる文章を置いて、出力されるファイル名をforやwhileの変数に関連ずけるには、どういったものを書けばよいでしょうか? たとえば、以下のようなプログラムを書いて実行すると、"test"という文が書かれた"1"というファイル名のファイルが出力されます。 / / / / / / / / / / / / / / / / / / / #include <iostream> #include <fstream> using namespace std; int main() { ofstream of; of.open("1", ios::app); of << "test" << endl; of.close(); return 0; } / / / / / / / / / / / / / / / / / / / 上のプログラムの中の出力ファイル名は"1"ですが、これをfor文等のループの中で"1"~"10"として10個のファイルを出力したいです。 以下のように書くと、"i"というファイルに"test"という文字が10個書き込まれます。 / / / / / / / / / / / / / / / / / / / #include <iostream> #include <fstream> using namespace std; int main() { int i; ofstream of; for(i=0; i<=10; i++) { of.open("i", ios::app); of << "test" << endl; of.close(); } return 0; } / / / / / / / / / / / / / / / / / / / 上のプログラムの中の"i"のクオーテーションマーク""をとって of.open(i, ios::app); のように書いたらエラーでコンパイルできません。また、 of.open((char*) i, ios::app); のように書くとコンパイルはできますが、ファイルができません。 ファイル名"1"に"test" ファイル名"2"に"test" ファイル名"3"に"test" ・ ・ ・ ファイル名"10に"test" という風に出力できればいいのですが... わかる方すみませんが、ご指導願います
- ベストアンサー
- C・C++・C#
- ofstreamのパラメータについて
こんにちは。 よろしくお願いいたします。 次の様なソースで、ofstreamで定義した「OutFile」をオープンし、 オープン出来たかどうかを、次のif文で見ています。 ofstreamで定義した「OutFile」は色々なパラメータを含んでいますが、このif文で見ているのは、「OutFile」のどこのパラメータでしょうか? ofstream OutFile; AnsiString asBuff; asBuff = "C:\\aaa.tmp"; OutFile.open( asBuff.c_str() ); if( !OutFile ){ ShowMessage("エラー"); }
- ベストアンサー
- C・C++・C#
- ファイル出力について
「test1」というファイルの最後の3行を「test2」というファイルに出力する。 というプラグラムはどのように組み立てればいいのでしょうか? (test1) 1行目の文 2行目の文 3行目の文 4行目の文 5行目の文 6行目の文 ↓ (test2) 4行目の文 5行目の文 6行目の文
- ベストアンサー
- C・C++・C#
- ファイル出力ついて
当方、JAVA初心者です。 CSVファイルの出力を行うプログラムを作成しています。 仕様として1行目はヘッダ部分を出力し、 2行目以降にDBの値を出力するCSVファイルを作成しようとしています。 例 (ヘッダ部分)"項目A----","項目B----","項目C----","項目D----" (データ部分)"項目Aの値","項目Bの値","項目Cの値","項目Dの値" ・ ・ ですが、データ部分の個数が不変になっており、ヘッダ部分がずれてしまいます。 例 項目Cの数が2個ある場合はデータ部分に項目Cの値を2個出力する為、 項目Dのヘッダ部の列の下に項目Cの2個目の値が書き込まれてしまいます。 "項目A----","項目B----","項目C-----","項目D-----" "項目Aの値","項目Bの値","項目Cの値1","項目Cの値2","項目Dの値" ・ ・ そこで、先にデータ部分の書き込みを行い、それぞれの項目のデータ件数の最大値を保持し、最後にデータ件数の最大値に合わせてヘッダ部分の書き込みを行おうと考えているのですが、 ファイルをopenしなおす方法以外で、 先に2行目以降の書き込みを行い、最後に1行目の書き込みを行う方法がわからなく困っております。 ご回答のほど、宜しくお願いします。
- ベストアンサー
- Java
- <Perl>参照配列の出力に失敗する。
<Perl>参照配列の出力に失敗する。 お世話になります。 配列の出力部で以下のエラーが出力されます。 Use of uninitialized value in print at test2.pl line 12. -----コーディングは以下の通りです。----- #!C:\perl use strict; use warnings; my @l = (); #----------- #GetDataへCSVファイル名と、格納用配列を渡す #----------- my $cnt = &GetData("test.csv", \@l); print "COUNT -> ".$cnt; for(my $i=0; $i < $cnt; $i++){ print $l[$i]; } ################################################################## # 概 要:指定したCSVファイルをオープンしCSVデータを配列に取得する。 # パラメータ:ファイル名, CSVデータ格納用配列 # 戻 り 値:データ取得件数 ################################################################## sub GetData { my ($f, @bf) = @_; my $rcnt = 0; print "FILE NAME -> ".$f."\n"; if ( open(FP, "<${f}") ){ print "FILE OPEN -> success.\n"; @bf = split(/,/, <FP>); close(FP); $rcnt = @bf; print "CSV GET COUNT -> ".$rcnt."\n"; } return $rcnt; } -----実行結果は以下の通りです。----- D:\>perl test.pl FILE NAME -> test.csv FILE OPEN -> success. CSV GET COUNT -> 5 Use of uninitialized value in print at test2.pl line 12. Use of uninitialized value in print at test2.pl line 12. Use of uninitialized value in print at test2.pl line 12. Use of uninitialized value in print at test2.pl line 12. COUNT -> 5 -----CSVファイルの内容は以下の通りです。(ファイル名:test.csv)----- あいうえお,かきくけこ,さしすせそ,たちつてと,なにぬねの 配列の要素数が取れているので、配列内にデータは格納されているとは思っています。 出力方法をどのように正せばよいがご教示お願い致します。
- ベストアンサー
- Perl
- E型の出力について
お世話になります。 Fortran90にてファイル出力する際、数値データをE型で出力します。 この時、値がゼロに非常に近いデータが「0.1820639214-253」のように出力されてしまいます。 何が問題なのか、教えてください。 ちなみに出力文は以下のような感じです。 open(10,FILE = DATA.dat,form='formatted') write(10,'(10E20.10)')((F(i,j),j=1,Nz),i=1,Nx) close(10)
- ベストアンサー
- その他(プログラミング・開発)
- print_rで出力した配列データファイルをfile_get_cont
print_rで出力した配列データファイルをfile_get_contentsでそのまま取り込もうとしましたが、配列としてではなく文字列として取り込んでしまいます。 ひとつの配列にまとまってしまします。 text.php $data=array(1,2,3,4,5); print_r($data); Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 [4] => 5 ) output.php これを別ファイルで取り込むと$value= file_get_contents("text.php"); echo $value; print_r($value);両方とも Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 [4] => 5 ) が出力されました。 配列として取り込みたいのですが可能でしょうか?
- ベストアンサー
- PHP
- 2つのエクセルから同じデータを持つ行を出力する方法
エクセルで作成した二つのDBがあります。それぞれ、列・行の数は異なるのですが、同じ名称の列(例えば郵便番号)を持っています。 この二つのファイルから、同じ列に同じ情報をもった行を取りだす、ということをしたいのですが、関数やマクロでの実現できる方法がございましたら、教えて頂けないでしょうか。 例:二つの住所録のようなファイルAとファイルBがあって、郵便番号が154-0001のデータ(行)を、別のファイルCに出力する。(また、ファイルC上では、各データがファイルAとファイルBのどちらから出力されたものかも、判別が付くように出力したい) 分かりにくいケースで大変恐縮ですが、ご存じの方がおりましたら、どうぞよろしくお願いいたします。 ※エクセル2003を使用しています。
- ベストアンサー
- その他MS Office製品
お礼
ありがとうございます。 虫取りも終わり、現在無事に動いております。 AWKの300倍以上の速度で。 なるほど、そういうことがあるのですね。 うーん、自分で勉強していてそんな情報に行き着くにはどれだけかかったことか。 どうもありがとうございました。