한 줄씩 또는 전체 텍스트 파일을 한 번에 읽는 방법은 무엇입니까?


86

나는 파일을 소개하는 튜토리얼에 있습니다 (파일에서 읽고 쓰는 방법)

우선, 이것은 숙제가 아닙니다. 이것은 제가 찾고있는 일반적인 도움 일뿐입니다.

한 번에 한 단어 씩 읽는 방법을 알고 있지만 한 번에 한 줄씩 읽는 방법이나 전체 텍스트 파일을 읽는 방법을 모릅니다.

파일에 1000 단어가 포함되어 있으면 어떻게됩니까? 각 단어를 읽는 것은 실용적이지 않습니다.

(읽기)라는 내 텍스트 파일에는 다음이 포함됩니다.

나는 게임하는 것을 좋아한다 나는 읽는 것을 좋아한다 나는 책 2 권을 가지고있다

이것이 내가 지금까지 성취 한 것입니다.

#include <iostream>
#include <fstream>

using namespace std;
int main (){

  ifstream inFile;
  inFile.open("Read.txt");

  inFile >>

각 줄이나 각 단어를 따로 읽는 대신 한 번에 전체 파일을 읽을 수있는 방법이 있습니까?


4
잘 정의 된 답은 여기에 있습니다 : stackoverflow.com/questions/551082/c-read-lines-from-file
샘슨 첸


한 단어 씩 읽는 것은 한 줄씩 읽는 것보다 약간 느립니다. 실제로 단어가 필요하면 단어를 읽는 것이 좋습니다. CSV 파일과 같은 라인 지향 데이터를 다루는 경우 라인을 읽으십시오.

@Arkadiy가 잘못되었습니다. 100MiB 파일의 경우 한 줄씩 읽는 데 몇 초가 걸리고 1 초 미만의 시간에 4KiB 블록을 읽습니다.
vallentin

@Vallentin : 스트림이 모두 버퍼링 된 경우 실제 디스크 읽기는 이미 블록 단위로 수행됩니다. 나머지는 메모리에서 데이터를 조작하는 것입니다.

답변:


163

다음을 사용할 수 있습니다 std::getline.

#include <fstream>
#include <string>

int main() 
{ 
    std::ifstream file("Read.txt");
    std::string str; 
    while (std::getline(file, str))
    {
        // Process str
    }
}

또한 명시 적으로 여는 것보다 생성자에있는 파일 이름으로 파일 스트림을 구성하는 것이 더 낫다는 점에 유의하십시오.

추가 문서 std::string::getline()CPP Reference 에서 읽을 수 있습니다 .

아마도 전체 텍스트 파일을 읽는 가장 쉬운 방법은 검색된 줄을 연결하는 것입니다.

std::ifstream file("Read.txt");
std::string str;
std::string file_contents;
while (std::getline(file, str))
{
  file_contents += str;
  file_contents.push_back('\n');
}  

9
명확하지는 않지만 while(getline(f, line)) { ...}실제로 권장되는 방법입니다. 여기에 설명되어 있습니다 : gehrcke.de/2011/06/… --- 적절한 오류 처리를위한 유용한 접근 방식도 찾을 수 있습니다.
Dr. Jan-Philip Gehrcke

1
위 코드 없이는 컴파일되지 않습니다#include <iostream>
Tyguy7

@ Tyguy7 왜 #include <iostream>필요할까요? 나에게 보인다 <fstream><string>충분하다. 당신이 의미하는 경우 std::getline, 그것은에있는 것이 <string>아니라에 <iostream>있습니다.
Fabio 말한다 Reinstate Monica

@FabioTurati 잘 모르겠습니다. 일단 포함하면 모든 것이 잘 컴파일된다는 것을 알고 있습니다.
Tyguy7

19

나는 이것이 정말 정말 오래된 스레드라는 것을 알고 있지만 실제로 정말 간단한 다른 방법을 지적하고 싶습니다. 이것은 몇 가지 샘플 코드입니다.

#include <iostream>
#include <fstream>
#include <string>
using namespace std;

int main() {

    ifstream file("filename.txt");
    string content;

    while(file >> content) {
        cout << content << ' ';
    }
    return 0;
}

2
좋은 대답, 나는 전체 파일을 거대한 stringstream으로 가져 오기 위해 cout 대신 stringstream과 함께 이것을 사용했습니다
bjackfly

5

istream .read () 함수를 사용할 수 있다고 생각합니다. 적절한 청크 크기로 루프를 수행하고 메모리 버퍼에 직접 읽은 다음이를 임의의 메모리 컨테이너 (예 : std :: vector)에 추가 할 수 있습니다. 예제를 작성할 수는 있지만 완전한 솔루션을 원하는지 의심 스럽습니다. 추가 정보가 필요한 경우 알려주십시오.


나는 누가이 대답을
반대표를 던 졌는지 모르겠지만

4

음, 이렇게하려면 C ++에서 제공하는 freopen 함수 ( http://www.cplusplus.com/reference/cstdio/freopen/)를 사용 하고 다음과 같이 파일을 한 줄씩 읽을 수도 있습니다.

#include<cstdio>
#include<iostream>

using namespace std;

int main(){
   freopen("path to file", "rb", stdin);
   string line;
   while(getline(cin, line))
       cout << line << endl;
   return 0;
}

1

아직 언급되지 않은 또 다른 방법은 std::vector.

std::vector<std::string> line;

while(file >> mystr)
{
   line.push_back(mystr);
}

그런 다음 벡터를 반복하고 필요한 것을 수정 / 추출 할 수 있습니다.


4
이것은 vector불필요한 단계입니다. 당신은 반복 할 수 ifstream사용하여 std::istream_iterator<std::string>(inFile).
Joseph Mansfield

0

이것을 사용하여 파일의 모든 줄을 하나씩 읽은 다음 i를 인쇄 할 수도 있습니다.

#include <iostream>
#include <fstream>

using namespace std;



bool check_file_is_empty ( ifstream& file){
    return file.peek() == EOF ;
}

int main (){


    string text[256];
    int lineno ;
    ifstream file("text.txt");
    int num = 0;

    while (!check_file_is_empty(file))
    {    
        getline(file , text[num]);
        num++;
    }
    for (int i = 0; i < num ; i++)
    {
        cout << "\nthis is the text in " <<  "line " << i+1 << " :: " << text[i] << endl ;


    }
    
    system("pause");

    return 0;
}

이것이 당신을 도울 수 있기를 바랍니다 :)


0

안녕하세요 형제 이것은이 코드를 사용하여 정확한 줄의 문자열을 읽는 방법입니다.

이것이 당신을 도울 수 있기를 바랍니다!

#include <iostream>
#include <fstream>

using namespace std;


int main (){


    string text[1];
    int lineno ;
    ifstream file("text.txt");
    cout << "tell me which line of the file you want : " ;
    cin >> lineno ; 



    for (int i = 0; i < lineno ; i++)
    {
        
        getline(file , text[0]);

    }   

    cout << "\nthis is the text in which line you want befor  :: " << text[0] << endl ;
    system("pause");

    return 0;
}

행운을 빕니다 !

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.