
No.3ベストアンサー
- 回答日時:
fgetsは文字列として読み込みます。
これを数値に変換すれば、とりあえずあなたが望んでいることができます。変換はatofを使います。また、atofを使用するときは#include <stdlib.h>が必要です。例えば
#include <stdlib.h>
:
double d;
:
d=atof("-3.0");
とすると、文字列の-3.0が数値の-3.0に変換されdに入ります。
fscanf関数で読み込んでもできますが、書式とデータがあっていないと上手くいかないので注意してください。
この回答への補足
回答ありがとうございます。
えっと、つまりは
while内で、
{
fgets(buffer,size,fp)
d=atof("buffer");
}
などと行えばいいのでしょうか。
また、この補足を読まれて、もしお時間があれば
fscan関数の使い方をお教え願いたいのですが。
ファイル操作関連は、参考書などが曖昧(実際にテキストファイルとその中身を具体的に書いていないため?)で、実際にはどのように使用したら良いのかわかりません。
回答ありがとうございます。
先に、補足の方を書いてしまって変更できないようなので、こちらで書かせて頂きます。
fscanをつかって
n=3500;/*数値の数*/
fp=fopen("date.txt","r");
for ( i = 0; i < n; i++ )
{
fscanf( fp, "%1.5e", &a[ i ] );
}
fclose( fp );
として、このあとprintfで、配列a[]を書き出したところ,
まったくでたらめな数値が書き出されてしまいました。
忠告頂いた、「書式とデータがあっていない」という状態なのでしょうか?
No.6
- 回答日時:
「でたらめ」というだけではわからんので, 「何がどうなったのか」も書いてくれるとありがたいなぁ.
ちなみに C++ 的には
#include <iostream>
#include <iterator>
#include <vector>
#include <algorithm>
という前提のもとで
std::ifstream ifs("data.txt");
std::vector<double> data;
std::copy(std::istream_iterator<double>(ifs), std::istream_iterator<double>(), std::back_inserter(data));
なのかもしれない.
何度も回答ありがとうございます!
「でたらめ」なデータとは、元のテキストファイル内容とはかけ離れた値で、
とんでもなく大きかったり、0でない場所が0になってしまっている状態です。
fscanfでのデータ入力が正しく行われていなかったようです。
やりたかったことは、実現できましたがTacosan にお教え頂いた方法も調べて試してみたいと思います。
本当にありがとうございました。
No.5
- 回答日時:
>fscanをつかって
n=3500;/*数値の数*/
fp=fopen("date.txt","r");
for ( i = 0; i < n; i++ )
{
fscanf( fp, "%1.5e", &a[ i ] );
}
fclose( fp );
として、このあとprintfで、配列a[]を書き出したところ,
まったくでたらめな数値が書き出されてしまいました。
忠告頂いた、「書式とデータがあっていない」という状態なのでしょうか?
私自身scanfやfscanfは余り使用しないので詳しくないのですが、以下のプログラムをコピペして実行してみてください。ヒントになりますか?
#include <stdio.h>
void main(){
float a[3];
FILE *fp;
fp=fopen("data01.txt","r");
for(int i=0;i<3;i++){
fscanf( fp, "%e\n", &a[ i ] );
}
fclose( fp );
for(int i=0;i<3;i++){
printf("%f\n",a[i]);
}
}
ちなみにdata01.txtの内容は
-12.30
12.22
11.12
です。
蛇足かもしれませんが、私がscanf系の関数を使用しない理由は、データ入力を間違えてたとき、正しくない数値が入るだけで、エラーにならないことが多いからです。データ入力を間違えたらエラーにして欲しいので、freadなどを用いて、自分でデータ解析を行い、おかしなデータであれば、直ぐエラーメッセージを出力する方が良い(エラーは早い段階で解った方がよい)と思います。
何度も回答頂き、有難うございます!
前回の回答を参考にしまして、以下のように書いたところ無事に読み込み、計算することができました。
FILE *fp;
char data[MAXDATASIZE];
if((fp=fopen("date.txt","rt"))==NULL){ /*ファイルを開いて*/
printf("file not open¥n");
exit(1);
}
int i;
double x[データの数分];
for(i=0;i<データの数分;i++){
fgets(data,MAXDATASIZE,fp);
x[i]=atof(data); /*文字列として読んだものを数値化*/
}
fclose(fp);
また、fscanfは頂いたソースを用いて勉強していきたいと思います。
しかし、調べたところcyacya2000さんのおっしゃった理由や、その他都合が悪いことがあるようで、
使われない方が多いようですね。
ほんとうに助かりました!ありがとうございました!
No.4
- 回答日時:
本当に配列が必要だとするとあらかじめ大きさがわかっていないとダメなんだけど, そこはいいの?
個人的にはこのフォーマットなら std::vector とか std::istream_iterator 使っちゃうなぁ....
この回答への補足
回答ありがとうございます。
大きさはあらかじめ、分かっている状態です。
数値はそれぞれ、○.○○E00 表記で、データ数3500個です。
何度も回答して頂いて、有難うございます。
みなさんの回答を読み合わせて、無事に読み込むことができました。
FILE *fp;
char data[MAXDATASIZE];
if((fp=fopen("date.txt","rt"))==NULL){ /*ファイルを開いて*/
printf("file not open¥n");
exit(1);
}
int i;
double x[データの数分];
for(i=0;i<データの数分;i++){
fgets(data,MAXDATASIZE,fp);
x[i]=atof(data); /*文字列として読んだものを数値化*/
}
fclose(fp);
これで、printfでx[]を書き出したところ、ちゃんと読みこめたようです。
もし、穴がありましたらご指摘お願い致します。
No.2
- 回答日時:
なお, 単に「うまくできない」と書くのではなく「どのように」うまくできないのか, つまり
・期待する結果
・実際の結果
も書くようにしてください.
しかし, 「ただの配列」が本当に必要なのかなぁ?
この回答への補足
ご指摘頂いたので、補足させて頂きます。
ひとつ前の方のところに書いたものとかぶりますが、
whileのループを使って、
fgetsで一行ずつ読みだそうと思い、以下のように行いました。
{
fgets(buffer, BUFFER_SIZE, fp);
printf("%s",buffer);
}
printfでの書き出しはできるので、読み込み自体はされているのですが、
それをどう配列に入れれば良いのかが初心者の浅知恵では参考書見てもわかりません。
期待する結果は、質問欄にかいた通り、テキストの値をひとつずつ配列に入れたいです。
また、実はこれ以降の計算部を配列を使って作っていまして、
その配列部を同じプログラム上で入れた数値ではなく、テキストファイルにある数値でおこなったらどういう結果になるのかを見たいのです。
そのために、a[]に入れたい、と。
えっと、つまりプログラムの前半部でとある計算結果の値を順に入れた配列A[]をつくった。
後半部で、その配列を用いて計算するプログラムを組んだ
その、配列A[]でなく、すでに別に存在している数値(テキストフォルダ)を読み込んで、
配列B[]にいれ、後半部の計算部をB[]に書き換えて計算を行いたいのです。
テキストフォルダの数値が、どのような計算結果のものなのか分かればいいのですが、
そういう説明はなく、ただ数値が書き込まれているものなので読み込むしか、ないかと・・。
No.1
- 回答日時:
>うまくできません!
途中までは書いてみたのでしょうか。
それでしたら、その途中までのソースを提示したほうが、有用なアドバイスが得られやすいと思いますよ。
この回答への補足
ご指摘頂いたので、補足させて頂きます。
途中まで、というのはwhileのループを使って、
fgetsで一行ずつ読みだすところまでです。
{
fgets(buffer, BUFFER_SIZE, fp);
printf("%s",buffer);
}
printfでの書き出しはできるので、読み込み自体はされているのですが、
それをどう配列に入れれば良いのかが初心者の浅知恵では参考書見てもわかりません。
buffer=a[i];
なんて、通りませんし・・・。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# [C言語] コメント文字列を無視して、数値データを読み込むプログラム部分について 5 2022/10/05 11:03
- Perl perlで2次元配列をサブルーチンに値渡しで渡す 5 2022/12/17 18:49
- C言語・C++・C# c言語の問題です 2 2023/07/21 10:51
- Excel(エクセル) 【VBA】指定フォルダに格納中のテキストファイルをエクセルで処理し結果のエクセルを新規フォルダに保存 1 2022/03/25 14:19
- C言語・C++・C# pythonのファイルの並びでの読み込みとリストについて 4 2022/04/13 03:52
- Visual Basic(VBA) 入力と同時に桁数を詰める 3 2022/09/11 20:23
- Microsoft ASP プログラミング関係で質問です。 3 2022/10/11 16:06
- Java java 次の機能を有するメソッドを自クラスに作成し、実装したいです。 機能 名前判定機能 →名前が 3 2022/06/16 16:08
- C言語・C++・C# 至急お願いします。C言語で.imgのファイルを読み込んで1バイトづつ出力するプログラムを作りたいので 3 2023/01/16 22:49
- Excel(エクセル) PowerQueryに詳しい方教えてください(Office365) 1 2022/07/24 21:11
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
shared_ptr クラスについて
-
JPEGやPNGが読めるLoadImage関数
-
vectorのイテレータを大小比較...
-
std::wstringのメモリリークに...
-
C++で、環境変数の読み込み方を...
-
なぜ、C++の標準ヘッダをインク...
-
#include "fstream.h"
-
wstringの内容を表示させたい
-
clock関数のコンパイルエラーで
-
C++での <iostream.h>と<iostre...
-
c++言語のwhile文
-
C言語 ストリームについて。
-
listをvectorにコピーするときに
-
C++ 平均値、最大値と最小値の...
-
UNICODE環境でCStringをstd::st...
-
winpcapを用いたプログラミング
-
string型の固定長文字列を配列...
-
LinuxのQtに関する質問です。
-
switch文のエラーについて
-
C++で、テキストファイルを一行...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VC++で文字列から任意の文字を...
-
なぜ、C++の標準ヘッダをインク...
-
構文エラーが出ているのですが...
-
enumの値から定義名を文字列化...
-
JPEGやPNGが読めるLoadImage関数
-
std::map の const 修飾について
-
VS2019でofstreamが未定義になる
-
_tcscat がうまくいきません(V...
-
空ENTERの判別
-
構造体配列のvectorへの変換と...
-
switch文のエラーについて
-
std::wstringのメモリリークに...
-
#define中の#のエスケープ
-
C++でShowCursorを使いたい。
-
findnext();について
-
【C++】ヘッダ内でstringを格納...
-
#include "fstream.h"
-
CStringとString
-
#defineの使い方について
-
iostream インクルード時に発生...
おすすめ情報