現在、txtファイルを移動する際に問題が発生しているため、配列に読み込むことができます。プログラムはうまくコンパイルが、私は実行したときには、端末に返します。このようなキャリッジリターンまたは改行が見つかりません。戻り値範囲外
#include<cstdlib>
#include<cmath>
#include<fstream>
#include<sstream>
#include<iomanip>
#include<iostream>
#include<string>
#include<cstring>
#include<cassert>
#include<ctime>
#include<cctype>
#include<algorithm>
#include<locale.h>
#include<stdio.h>
#include<functional>
#include<math.h>
using namespace std;
int main(int argc, char**argv)
{
int r=0;
int p=0;
int c=0;
string names[20];
double scores[20][10];
ifstream infile;
infile.open("./bowlers.txt");
for(int r=1;r<=10;r++)
{
getline(infile,names[r]);
p=names[r].find_first_of("\n") ;
names[r].erase(p,2);
for(c=1;c<=5;c++)
{
infile>>scores[r][c];
}
infile.ignore(100,'\n');
}
infile.close();
for(int r=1;r<=10;r++)
{
cout<<fixed<<setprecision(2)<<endl;
cout<<names[r]<<endl;
}
return 0;
}
txtファイル私が使用しているルックス:
charles
123
321
222
rose
432
515
123
Greg
123
553
136
ここ
terminate called after throwing an instance of 'std::out_of_range'
what(): basic_string::erase: __pos (which is 18446744073709551615) > this->size() (which is 14)
Aborted (core dumped)
コードです
これは私がこの問題を自分自身で調べたところで分かったことです:
- EOLは、UnixおよびWindowsによって異なる方法で処理されます。
\n
が、それは-1を返したことはありませんので、
が問題を引き起こしている、とすることはできませんp=names[r].find_first_of('\n') ; names[r].erase(p,2);
.erase
-1:私の問題の 一部は、ということでしょうか?
私は\r,
\n
、\r\n
、などの考えられるあらゆるを使用してみましたが、私はいつも大体同じ出力を受け取ります。私も.txtファイルのエンコーディングを変更しようとしました。唯一の違いは(which is 14)
です。番号は.txtファイルをどのようにエンコードするかによって変動します。また、vimで.txtファイルを開き、改行文字を表示するには:set list
を開いています。だから私は彼らがそこにいることを知っている。
これは、学校向けのはるかに大きなプロジェクトの一部のコードであり、私はまだC++にはあまり経験がありません。誰かが私を正しい方向に向けることができますか?私は一度私は私のコードのこの部分は、私がプロジェクトを完了することができることがわかったように感じる。
注:txtファイルは単なる例であり、私のforループの配列やパラメータのサイズをあまり考慮しないでください。私は配列が存在しない行を読み込もうとする際に問題がないことを確認するために配列のサイズを3倍にチェックしました。
ここでの答えは、「なぜ水が濡れているのか」と「なぜ空が青いのですか」と同じ答えです。 'getline()'の目的は、入力ストリームから次の行を読み込み、改行*を除いた 'std :: string' *に保存することです。 'std :: getline()'によって定義された文字列に '\ n'を得ることは決してありません。これが 'std :: getline()'の働きです。 –
Cで 'fgets()'に慣れているので混乱しているかもしれません。これは文字列に改行を保持します。しかし、C++の 'getline()'はそれをしません。 – Barmar
18446744073709551615は2から64乗-1を引いたものです。これは符号なし64ビット整数の最大値です。それを得るための一般的な方法は、符号なし64ビット整数を期待する変数に-1を与えることです。あなたは '名前'の要素の1つの始まりを見ようとしているところでは、良いことがあります。 – user4581301