>source

줄에서 처음 150자를 추출하여 char [] 배열에 저장해야합니다 (문자열 허용 안 됨). 아래 코드가 작동하지 않고 그 이유를 찾을 수 없습니다.

#include <ifstream>
#include <iostream>
using namespace std;
int main()
{
    ifstream myFile;
    myFile.open("message.txt");
    if(!myFile.is_open()) cout<<"error"; //added this after edit
    const int SIZE = 151;
    char buffer[SIZE]={};
    while(myFile.getline(buffer, 151)){
        buffer[150]='\0';
        cout<<buffer<<endl;
    }
    myFile.close();
}

다음은 "message.txt"의 일부입니다.

abcdefg
hijklmn
opqrstuv
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
hello

단순히 아무것도 출력하지 않습니다. "message.txt"파일이 존재하며 그 안에 여러 줄의 문자가 있습니다. 내가 어디에서 틀렸어? 편집 : 줄의 문자가 150 개 미만이면 모두 읽어야합니다. 150보다 크면 나머지는 무시해야합니다.

  • 답변 # 1

    첫 번째 줄의 처음 150자를 읽으려고한다면 while 고리. 그리고 널 종료 할 필요가 없습니다. buffer 수동으로 istream::getline() 예를 들면 다음과 같습니다.

    #include <ifstream>
    #include <iostream>
    using namespace std;
    int main()
    {
        ifstream myFile("message.txt");
        if (!myFile.is_open())
        {
            cout << "error";
            return 0;
        }
        const int SIZE = 151;
        char buffer[SIZE] = {};
        myFile.getline(buffer, SIZE);
        cout << buffer << endl;
        myFile.close();
        return 0;
    }
    
    

    처음 150자를 읽으려면특정 라인의, 모든 줄을 건너 뛰려면 루프가 필요합니다.길이에 관계없이원하는 행에 도달 할 때까지 해당 행의 150자를 읽을 수 있습니다. 예 :

    #include <ifstream>
    #include <iostream>
    #include <limits>
    using namespace std;
    int main()
    {
        ifstream myFile("message.txt");
        if (!myFile.is_open())
        {
            cout << "error";
            return 0;
        }
        size_t lineIndex = ...;
        while (lineIndex > 0)
        {
            if (!myFile.ignore(numeric_limits<streamsize>::max(), '\n'))
            {
                cout << "error";
                return 0;
            }
            if (myFile.eof())
            {
                cout << "eof";
                return 0;
            }
            --lineIndex;
        }
        const int SIZE = 151;
        char buffer[SIZE] = {};
        myFile.getline(buffer, SIZE);
        cout << buffer << endl;
        myFile.close();
        return 0;
    }
    
    

    처음 150자를 읽으려면각 라인의, 성공적으로 읽은 후 다음 줄을 읽기 전에 줄 바꿈 전에 남아있는 모든 문자를 건너 뛰어야합니다. 예 :

    #include <ifstream>
    #include <iostream>
    #include <limits>
    using namespace std;
    int main()
    {
        ifstream myFile("message.txt");
        if (!myFile.is_open())
        {
            cout << "error";
            return 0;
        }
        const int SIZE = 151;
        char buffer[SIZE] = {};
        do
        {
            myFile.getline(buffer, SIZE);
            if (myFile.bad())
            {
                cout << "error";
                return 0;
            }
            if (myFile.fail())
            {
                // SIZE-1 characters were extracted before a line break
                // was reached, need to reset the error to keep going...
                myFile.clear();
                myFile.ignore(numeric_limits<streamsize>::max(), '\n');
            }
            cout << buffer << endl;
        }
        while (!myFile.eof());
        myFile.close();
        return 0;
    }
    
    

관련 자료

  • 이전 html - sass에서 WebP를 사용하는 방법
  • 다음 java - Gradle에서 아키타 입을 생성 할 수 있습니까?