Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;和C文件I/O_C++_File_Io - Fatal编程技术网

C++ C++;和C文件I/O

C++ C++;和C文件I/O,c++,file,io,C++,File,Io,C++文件I/O比C文件I/O更难。 那么在C++中,为文件I/O创建一个新的库是有用的还是不可行的?我的意思是 有谁能告诉我,C++文件I/O?< P>批量有什么好处吗?也有缺点。详见C++语言常见问题解答。简言之:类型安全性和用户定义的类型。std::ifstream和std::ofstream已经在stl库中。你不必自己创造 主要优点是所有的输出和输入都是类型安全的。 < P> C和C++是两种不同的语言。C++文件IO需要一些时间来使用,但是一旦使用了算法、异常等,它们就自然而然地会出现

C++文件I/O比C文件I/O更难。 那么在C++中,为文件I/O创建一个新的库是有用的还是不可行的?我的意思是

有谁能告诉我,C++文件I/O?

< P>批量有什么好处吗?也有缺点。详见C++语言常见问题解答。简言之:类型安全性和用户定义的类型。

std::ifstream和std::ofstream已经在stl库中。你不必自己创造


主要优点是所有的输出和输入都是类型安全的。

< P> C和C++是两种不同的语言。C++文件IO需要一些时间来使用,但是一旦使用了算法、异常等,它们就自然而然地会出现。p> 意见

我不知道使用C++流的任何真正的项目。它们太慢,很难使用。有几个较新的库,如和声称更好的版本在上一期ACCU Overload杂志中有一篇关于它们的文章。个人来说,我在C++中使用了C文件库,在过去的15年左右,我看不到任何改变的原因。 速度

下面是一个小测试程序(我快速拼凑)来说明基本的速度问题:

#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;
    }
正如我们所看到的,这个简单的例子慢了52倍。我希望有办法让它更快

注意:在我的例子中,将Enl改为'\n ',改进了C++流,使它比文件*流慢了3倍(谢谢),有可能使它更快。 使用难度

我不能说printf()不简洁,但它更灵活(IMO),而且更容易理解,一旦您通过了宏代码的初始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 );
double pi=3.14285714;

CUT< P>缓冲缓冲区溢出似乎是C++的一大胜利。

< P>请看

那么你会更喜欢C++ +I/O而不是C I/O < /P> 简而言之,如果您在读取或写入之前就知道数据大小,并且为了提高速度,最好使用C。


如果你不知道数据大小和高效代码,C++是首选的。

< P> Prtff//Frstyle风格I/O和C++ IO流格式的性能差异是非常依赖于实现的。一些实现(例如VisualC++),在文件*对象的顶部构建IO流,这往往会增加它们的实现的运行时复杂度。但是,请注意,以这种方式实现库没有特定的约束

我自己认为,C++ I/O的好处如下:

  • 类型安全,如前面所述。
  • 实施的灵活性。可以编写代码对通用ostream或istream对象进行特定的格式化或输入。然后,应用程序可以使用任何类型的派生流对象调用此代码。如果我针对文件编写和测试的代码现在需要应用于套接字、串行端口或其他类型的内部流,则可以创建特定于此类I/O的流实现。以这种方式扩展C样式I/O甚至是不可能的。
  • 语言环境设置的灵活性:在我看来,使用单一全局语言环境的C方法存在严重缺陷。我曾经遇到过这样的情况:我调用了库代码(一个DLL),它更改了代码下面的全局语言环境设置,并完全破坏了我的输出。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);
(注意,MSVC版本是在我的笔记本电脑上运行的,硬盘速度要慢得多)


但这给了我们1.5-2.3倍的性能差异,这取决于实现。和其他外部因素。

< P>每当需要在C++文件中输入/输出时,我只使用两行。< /P>
freopen("input.txt","r",stdin); // for input from file
freopen("output.txt","w",stdout);// for output from file
现在,您可以像通常一样从控制台扫描变量,并且打印为输出的内容将显示在output.txt文件中


所以我不认为C++中的文件I/O很难,比C</P>更容易。我不这么认为。。o_onobdy似乎知道你所说的“更强硬”是什么意思。想详细说明一下吗?现在,你的问题只是要求开始一场火焰战。C更快。。。动态存储的额外成本又如何呢。你有没有仔细比较过使用它的费用。请参阅最后一个ACCU重载中的:/FastFormat/。我猜您指的是gets()。还有其他标准的C I/O函数会导致缓冲区溢出吗?当然,如果你不小心的话,可以使用scanf(或fscanf)。@Mikeage:很好的一点,%s in…scanf()是一个等待发生的缓冲区溢出。准确地说是Illusional类型安全。我不太理解“Illusional”这个术语。这是很真实的。当然,射中自己的脚总是一种选择。因为可以通过临时对象自动创建对象,所以对象可以跳转类型。@David:对象可以跳转类型,但标准库中没有这样做,通常的智慧是将用户定义的转换限制在最小值,以避免这一点。@戴维:Otoh,我认为这是一个错误,即看似合理的代码的STD::OFFROW(“某个文件”)您的比较是有缺陷的。C和C++版本不做同样的事情。C++版本在每个行(EnDL)之后刷新缓冲区。有时候,阅读您使用的代码文档是一个好主意。调用printf更灵活也是毫无意义的。它不适用于用户定义的类型。这几乎不灵活。它远不如iostreams灵活。我认为C++版本更容易理解。我可以猜到setprecision的作用。%+。3不太明显。std::endl比简单插入换行慢,因为std::endl被定义为同时刷新流。@David:我意识到这是很久以前的事了。。但我只是运行了上面的测试程序(没有endl),得到了非常类似的结果。在调试模式下,我得到了simi
G++ 4.1.2:
C FILE: 4s
C++ Streams: 6s

MSVC9.0:
C FILE: 10s
C++ Streams: 23s
freopen("input.txt","r",stdin); // for input from file
freopen("output.txt","w",stdout);// for output from file