문제

C ++ 파일 I/O는 C 파일 I/O보다 강합니다. C ++에서 파일 I/O 용 새 라이브러리를 만드는 것이 유용합니까? 내말은 <fstream>누구든지 C ++ 파일 I/O에 어떤 이점이 있습니까?

도움이 되었습니까?

해결책

의견

C ++ 스트림을 사용하는 실제 프로젝트는 모릅니다. 그들은 너무 느리고 사용하기가 어렵습니다. 몇 가지 새로운 라이브러리가 있습니다 FastFormat 그리고 후원 더 나은 것으로 주장하는 버전은 마지막 Accu Overload 잡지에 그들에 관한 작품이있었습니다. 개인적으로 나는 C ++에서 지난 15 년 동안 C 파일 라이브러리를 사용했으며 아직 변경할 이유가 없습니다.

속도

다음은 기본 속도 문제를 보여주기 위해 소규모 테스트 프로그램 (빨리 함께 노크)입니다.

#include <stdio.h>
#include <time.h>

#include<iostream>
#include<fstream>

using namespace std;

int main( int argc, const char* argv[] )
    {
    const int max = 1000000;
    const char* teststr = "example";

    int start = time(0);
    FILE* file = fopen( "example1", "w" );
    for( int i = 0; i < max; i++ )
        {
        fprintf( file, "%s:%d\n", teststr, i );
        }
    fclose( file );
    int end = time(0);

    printf( "C FILE: %ds\n", end-start );

    start = time(0);
    ofstream outdata;
    outdata.open("example2.dat");
    for( int i = 0; i < max; i++ )
        {
        outdata << teststr << ":" << i << endl;
        }
    outdata.close();
    end = time(0);

    printf( "C++ Streams: %ds\n", end-start );

    return 0;
    }

그리고 내 PC의 결과 :

C FILE: 5s
C++ Streams: 260s

Process returned 0 (0x0)   execution time : 265.282 s
Press any key to continue.

우리가 볼 수 있듯이이 간단한 예제는 52 배 느립니다. 더 빨리 만들 수있는 방법이 있기를 바랍니다!

노트: 내 예에서 endl을 ' n'으로 변경하면 C ++ 스트림이 향상되었습니다. 파일* 스트림보다 3 배 느립니다 (감사합니다 JALF) 더 빨리 만들 수있는 방법이있을 수 있습니다.

사용하기 어려움

나는 printf ()가 간결하지 않다고 주장 할 수 없지만 매크로 코드의 초기 WTF를 지나면 더 유연하고 이해하기가 더 간단하다고 주장 할 수는 없습니다.

double pi = 3.14285714;

cout << "pi = " << setprecision(5)  << pi << '\n';
printf( "%.5f\n", pi );

cout << "pi = " << fixed << showpos << setprecision(3) << pi << '\n'; 
printf( "%+.3f\n", pi );

cout << "pi = " << scientific << noshowpos << pi<< '\n';
printf( "%e\n", pi );

질문

예, 더 나은 C ++ 라이브러리가 필요할 수 있습니다. FastFormat 그 라이브러리는 시간만이 말할 것입니다.

데이브

다른 팁

버리 싱 버퍼 오버런은 나에게 C ++에게 큰 승리처럼 보입니다.

살펴보세요

http://www.ddj.com/cpp/184403651

그런 다음 CI/O보다 C ++ I/O를 선호합니다.

한마디로 읽기 또는 쓰기 전에 데이터 크기를 알고있는 경우 C를 선호합니다. 데이터 크기를 모르고 효율적인 코드를 위해 C ++가 선호됩니다.

David Allan Finch의 답변에 대한 응답으로, 나는 그의 벤치마킹 코드에서 오류를 수정했습니다 (그는 한 줄마다 C ++ 버전에서 스트림을 플러시했습니다).

C ++ 루프는 이제 다음과 같습니다.

start = time(0);
{
    ofstream outdata("example2.txt");
    for( int i = 0; i < max; i++ )
    {
        outdata << teststr << ":" << i << "\n"; // note, \n instead of endl
    }
}
end = time(0);

나는 100000000 개의 반복을 실행합니다 (원래 코드보다 10 배 더 많습니다. 그렇지 않으면 숫자가 너무 작기 때문에 숫자가 너무 작기 때문에 우리에게 의미있는 것을 제공하기에는 너무 작습니다)). 출력은 다음과 같습니다.

G++ 4.1.2:
C FILE: 4s
C++ Streams: 6s

MSVC9.0:
C FILE: 10s
C++ Streams: 23s

(메모, MSVC 버전은 하드 드라이브가 상당히 느리게 내 노트북에서 실행되었습니다)

그러나 이것은 구현에 따라 1.5-2.3 배의 성능 차이를 제공합니다. 그리고 다른 외부 요인.

printf ()/fwrite 스타일 I/O와 C ++ IO 스트림 형식 간의 성능 차이는 구현에 따라 다릅니다. 일부 구현 (예 : Visual C ++)은 파일 * 객체 위에 IO 스트림을 구축하며 이는 구현의 런타임 복잡성을 증가시키는 경향이 있습니다. 그러나 이러한 방식으로 라이브러리를 구현할 특별한 제약이 없음을 주목하십시오.

내 의견으로는 C ++ I/O의 이점은 다음과 같습니다.

  • 앞에서 이미 언급 한대로 안전을 입력하십시오.
  • 구현의 유연성. 코드는 일반적인 형식 또는 IsTream 객체와 또는 입력을 수행하도록 작성할 수 있습니다. 그런 다음 응용 프로그램은 모든 종류의 파생 스트림 객체 로이 코드를 호출 할 수 있습니다. 파일에 대해 작성하고 테스트 한 코드가 이제 소켓, 직렬 포트 또는 다른 종류의 내부 스트림에 적용 해야하는 경우 해당 I/O에 맞는 스트림 구현을 만들 수 있습니다. 이러한 방식으로 C 스타일 I/O를 확장하는 것은 불가능한 일이 아닙니다.
  • 로케일 설정의 유연성 : 단일 글로벌 로케일을 사용하는 C 접근 방식은 제 생각에 심각한 결함이 있습니다. 내 코드 아래의 글로벌 로케일 설정을 변경하고 내 출력을 완전히 엉망으로 만드는 라이브러리 코드 (DLL)를 호출 한 사례를 경험했습니다. C ++ 스트림을 사용하면 스트림 객체에 모든 로케일을 흡수 할 수 있습니다.

std :: ifstream 및 std :: ofstream은 이미 STL 라이브러리에 있습니다. 당신은 당신의 자신을 만들 필요가 없습니다.

주요 이점은 모든 출력이며 입력은 유형 안전입니다.

C와 C ++는 두 가지 언어입니다. C ++ 파일 IO는 익숙해지는 데 약간의 시간이 걸리지 만 알고리즘, 예외 등을 사용하면 매우 자연스럽게 제자리에 떨어지는 경향이 있습니다.

C ++의 파일에 입력/출력을 가져와야 할 때마다 두 줄만 사용합니다.

freopen("input.txt","r",stdin); // for input from file
freopen("output.txt","w",stdout);// for output from file

이제 콘솔에서 평소와 같이 변수를 스캔 할 수 있으며 출력으로 인쇄 한 내용은 output.txt 파일에 표시됩니다.

그래서 나는 C ++의 파일 I/O가 힘들고 C보다 다소 쉽다고 생각하지 않습니다.

많이. 단점도. 자세한 내용은 C ++ 언어 FAQ를 참조하십시오. 요컨대 : 유형 안전 및 사용자 정의 유형.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top