Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.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/1/typo3/2.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++ - Fatal编程技术网

C++ 创建选项卡清除文本文件的更快方法?

C++ 创建选项卡清除文本文件的更快方法?,c++,C++,我的许多程序输出大量数据,供我在Excel上查看。查看所有这些文件的最佳方式是使用制表符删除文本格式。目前我使用这段代码来完成: ofstream output (fileName.c_str()); for (int j = 0; j < dim; j++) { for (int i = 0; i < dim; i++) output << arrayPointer[j * dim + i] << " "; output &l

我的许多程序输出大量数据,供我在Excel上查看。查看所有这些文件的最佳方式是使用制表符删除文本格式。目前我使用这段代码来完成:

ofstream output (fileName.c_str());
for (int j = 0; j < dim; j++)
{
    for (int i = 0; i < dim; i++)
        output << arrayPointer[j * dim + i] << " ";
    output << endl;
}
流输出的
(fileName.c_str());
对于(int j=0;j输出不要使用endl。它将刷新流缓冲区,这可能非常低效。相反:

output << '\n';
output
流输出(fileName.c_str());
对于(int j=0;j输出是否必须用C编写?如果不是,有许多工具已经用C编写,例如(g)awk(可以在unix/windows中使用),它可以很好地完成文件解析工作,也可以在大文件上使用

awk '{$1=$1}1' OFS="\t" file

这样做可能会更快:

ofstream output (fileName.c_str());
for (int j = 0; j < dim; j++)
{
    for (int i = 0; i < dim; i++)
        output << arrayPointer[j * dim + i] << '\t';
    output << '\n';
}
流输出的
(fileName.c_str());
对于(int j=0;j输出使用CiO,它比C++ iO快很多。我听说编程竞赛中的人纯粹是因为使用C++ IO而不是C IO。
#include <cstdio>

FILE* fout = fopen(fileName.c_str(), "w");

for (int j = 0; j < dim; j++) 
{ 
    for (int i = 0; i < dim; i++) 
        fprintf(fout, "%d\t", arrayPointer[j * dim + i]); 
    fprintf(fout, "\n");
} 
fclose(fout);
#包括
FILE*fout=fopen(fileName.c_str(),“w”);
对于(int j=0;j

只是更改<代码> %D< /代码>为正确的类型。

< P>我决定测试C STDIO比C++ +流快。(扰流板:是的,但不一定要多。)为此,我使用了以下测试程序:

通用包装器代码,从以下程序中省略:
#包括
#包括
内部主(空){
//程序代码在这里
}
程序1:正常同步C++ IO流
for(int j=0;j
STD::CUT必须是一个自定义的C++程序吗?我想不是。我只是还没有学会如何使用自定义库和东西……我不知道如何正确地链接它。我认为建议是用t代替空间更多地使用char(t′)代替字符串(“”)。比实际的空间与制表符大。写入字符串需要迭代才能找到“\0”。虽然我不认为这是这种情况下的瓶颈…我认为它更快,但与直接将双数组写入硬盘驱动器相比,速度仍然慢得不合理。检查硬盘驱动器的使用情况,我的程序在输出时以500KB/s的速度写入当输出直接二进制数据时,它会以50MB/s的速度删除文件。为什么这么慢?格式化输出总是比原始输出慢很多,但通常不是10倍(假设您的评论中混合了MB和KB)-可能还有其他原因。我再次检查,它跳了一点,但写入中的光盘使用率大约在30-45MB/s。我非常确定这不是我的CPU造成的,是Q6600 2.4ghz。我感觉文本文件被切碎成小块,并以小块的形式写入HD,而不是一大块的bUFFER。有没有办法解决这个问题?你可以试着把所有东西写入一个StrimFipe而不是文件流,然后把StrugScript输出到一个块中。这将比使用文件流占用更多的内存,并且可能会更快,也可能不会更快。Alternativel,废弃C++流输出,使用C流和fPrftf.()这将比iOFFICE快得多。抱歉,我不熟悉这个,这是什么?他似乎想加快已经用C++编写的程序的输出。我不知道AWK能如何帮助它。@ FAKEN,它是一个常用的文件处理工具。也通过GNU移植到Windows。它也是用C编写的,所以你可以这样做。不必重新发明轮子。当然,只有在你有能力的情况下才能使用它。在你的“项目”中@Neil,我假设他已经有了由他的程序生成的巨大数据文件。是的,我的项目是我的论文。到目前为止,没有我个人没有写过的代码(我是一名机械工程师,不是计算机科学家,所以我在编码方面的知识有限,我真的不想使用一些我不懂的东西,更不用说我的教授问我了)。谢谢,速度明显更快。我真的很好奇到底有多快,我自己从来没有测试过。请你引用一些数字好吗?我的硬盘速度大约为10MB/s,但这是双倍的。用以前的方法,它只有500KB/s左右。实际上,这种差异很可怕……尽管我想知道这个笨重的设备是什么pe的东西会做,因为它肯定会给你更好的批处理。顺便说一句,我知道这是一个老问题,但我很好奇,所以我想看看你的说法是否成立。(看起来是这样,尽管差异可能很大,也可能不明显。)
awk '{$1=$1}1' OFS="\t" file
ofstream output (fileName.c_str());
for (int j = 0; j < dim; j++)
{
    for (int i = 0; i < dim; i++)
        output << arrayPointer[j * dim + i] << '\t';
    output << '\n';
}
#include <cstdio>

FILE* fout = fopen(fileName.c_str(), "w");

for (int j = 0; j < dim; j++) 
{ 
    for (int i = 0; i < dim; i++) 
        fprintf(fout, "%d\t", arrayPointer[j * dim + i]); 
    fprintf(fout, "\n");
} 
fclose(fout);