2016-11-29 6 views
-2

私のコードにいくつか問題があります。 .datファイルの要素を配列に入力するように求められました。クラスでは、各ファイルに含まれる要素の数を知らなくても、さまざまなファイルに対してこれを実行する必要があります。私たちが知っている唯一の事は、ここではファイルあたり5000要素以上になることはないということです。私は自分のコードを実行すると入力要素はファイルの出力要素と異なります。C++

5.675207 -0.571210 
0.728926 0.666069 
2.290909 0.751731 2.004545 0.907396 
0.702893 0.646427 5.909504 -0.365045 
2.082645 0.871841 5.597107 -0.633507 
6.117769 -0.164663 6.091736 -0.190282 
5.571074 -0.653433 4.503719 -0.978307 
3.983058 -0.745620 
3.670661 -0.504729 
5.857438 -0.413001 

私の入力ファイルの一つは、以下の要素を持っている

#define _CRT_NONSTDC_NO_DEPRECATE 
#include <iostream> 
#include <fstream> 
#include <cstring> 

using namespace std; 

int main(int argc, char * argv[]) 
{ 
ifstream fin; 
ofstream fout; 

if (argc < 3) 
{ 
    cout << "Incorrect usage: prog.exe filenname number" << endl; 
    cout << "Exiting now, please try again." << endl; 
    return -1; 
} 

fin.open(argv[1]); 
if (!fin) 
{ 
    cout << "Error opening file \"" << argv[1] << "\", exiting." << endl; 
    return -1; 
} 

fout.open(argv[2]); 

int count = 0; 
int word; 
double points[5000]; 

while (fin >> word) 
{ 
    fin >> points[count]; 
    ++count; 
} 

fout << "Numer of points is: " << count/2 << endl; 

for (int i = 0; i < count; i++) 
{ 
    fout << points[i] << " "; 
} 

fin.close(); 
fout.close(); 

return 0; 
} 

を私はちょうど彼らが正しく入力されたことを確認するための要素を出力します。私は次のようなことをして、私は理由を知らない。

0.675207 0.57121 
0.728926 0.666069 
0.290909 0.751731 0.004545 0.907396 
0.702893 0.646427 0.909504 0.365045 
0.082645 0.871841 0.597107 0.633507 
0.117769 0.164663 0.091736 0.190282 
0.571074 0.653433 0.503719 0.978307 
0.983058 0.74562 
0.670661 0.504729 
0.857438 0.413001 

何らかの理由で最初の数字が0に変換され、負の数字が正になります。誰がなぜこれが起こっているのか知っていますか?

+2

デバッガを使用してコードをステップ実行する方法を学ぶ必要があります。 –

+0

このような問題を解決する適切なツールは、デバッガです。スタックオーバーフローを尋ねる前に、コードを一行ずつ進める必要があります。詳しいヘルプは、[小さなプログラムをデバッグする方法(Eric Lippert)](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)を参照してください。最低でも、あなたはあなたが行った観察と一緒に、[編集]あなたの質問あなたの問題を再現[、最小完全、かつ検証](http://stackoverflow.com/help/mcve)の例を含むようにする必要があります\しますデバッガ。 –

+0

ストリームから項目を2回読み込みます( 'word'と' points [count] 'を交互に使います)。 –

答えて

0
int word; 

はあなたには好意的ではありません。最初は整数なので、fin >> wordは入力の整数部分だけを読み込みます。 5.675207は5として読み込まれます。.675207はfin >> points[count]のファイルストリームに残ります。単語が5に保存されていない場合は破棄されますが、.675207はpoints[0]に0.675207として存在します。

負の符号は、私はすべてを修正

while (fin >> points[count]) 
{ 
    ++count; 
} 

ので把握しようと気にしませんでしたつもり

0

ファイルから数値を読み込むと、それらを「単語」として抽出して「ポイント」として保存しています。 "word"は整数で、 "points"はdoubleです。これは予期しない動作をします。コンパイラはこれに関する警告を出すべきです。

+0

は、彼が望んでいることはほとんどない「ひれ」から2回読むことを指摘するべきである。 – artm

+0

ユーザの性別を仮定しないことを指摘するべきである。 – Harper

+0

「単語」をダブルに変更したが、また、小数点より前の最初の数値を0に変更し続けました –

関連する問題