현재 배열로 읽을 수 있도록 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 비트 정수입니다. 이를 얻는 일반적인 방법은 -1을 부호없는 64 비트 정수를 기대하는 변수에 넣는 것입니다. 확률은 네가 '이름'요소 중 하나의 시작 부분을 보려고하는 것이 좋다. – user4581301