C++ 如何使用SetFilePointer重定向到.csv文件的顶部

C++ 如何使用SetFilePointer重定向到.csv文件的顶部,c++,csv,C++,Csv,基本上,我正在为一系列要运行的测试创建一个错误日志,记录失败和成功。错误日志是一个.csv文件。基本上,程序采用了一个测试列表,例如,它们被命名为#testlist.txt。每个#testlist.txt中都包含一系列测试 比如说, #testlist.txt包含: Test1.txt Test2.txt Test3.txt 在Test1.txt中,有3个子测试。这些子测验可能失败或成功;因此,成功率和失败率。因此,此错误日志报告的是每个测试的统计信息,以及使用#testlist的所有测试的全局

基本上,我正在为一系列要运行的测试创建一个错误日志,记录失败和成功。错误日志是一个.csv文件。基本上,程序采用了一个测试列表,例如,它们被命名为#testlist.txt。每个#testlist.txt中都包含一系列测试

比如说,

#testlist.txt包含:

Test1.txt

Test2.txt

Test3.txt

在Test1.txt中,有3个子测试。这些子测验可能失败或成功;因此,成功率和失败率。因此,此错误日志报告的是每个测试的统计信息,以及使用#testlist的所有测试的全局成功率和失败率

我的任务是将#testlist的统计数据放在列表的顶部而不是底部问题是:我不知道如何在打印完所有单个测试统计数据后重定向到文件顶部,以便将全局统计数据打印到.csv文件中

我在Visual Basic 2008中使用C++。任何建议都会非常有用!非常感谢你

更新: 因此,这似乎是一个愚蠢的问题,但我去MSDN查找SetFilePointer,这是我的同事建议我尝试的,但对于为什么它在我的代码中不起作用,这是没有意义的

if (SetFilePointer(m_pDlg->sumLog,0,NULL,FILE_BEGIN) != INVALID_SET_FILE_POINTER){
        fprintf(m_pDlg->sumLog, "\n\n%s,%s,%d,%d,%d,%0.2f%%,%0.2f%%", pDlg->testlistFileName, s, m_pDlg->m_uiValTotal, 
            m_pDlg->m_uiValPassed, m_pDlg->m_uiValFailedGlobal,
            m_pDlg->getSuccessRate(m_pDlg->m_uiValTotal, m_pDlg->m_uiValPassed),
            m_pDlg->getFailureRate(m_pDlg->m_uiValTotal, m_pDlg->m_uiValFailedGlobal));
    }
也许我对这个方法的理解是错误的,如果有人能对此有所了解并帮助我实现这个目标,我将不胜感激

问题:SetFilePointer始终等于无效的\u SET\u FILE\u指针

更多信息:

m_pDlg->sumLog
这是我要写入的文件的名称。在这个文件的末尾(可能是1GB左右的数据),我试图开始插入这一行。 我已经宣布它是

FILE* sumLog;
如果需要更多信息,我很乐意提供


再次感谢你

您是否在询问如何在文件已包含内容后在文件顶部写入新数据

如果是这样的话,答案是尝试在文件末尾以外的任何位置插入数据效率极低。基本上,您需要将插入点之后的每个字节移到文件中较低的位置。这涉及到以非常复杂的方式读取和重写每个字节


因此,最好的解决方案是将新内容写入新文件,然后在新内容之后将原始文件复制到新文件。这更高效,更容易实现。

您不能简单地将这种可变长度的数据插入已打开文件的开头。您需要一种不同的方法:

  • 您在
    .csv
    中读取数据时跳过了统计数据行,并将其移动到备份文件中
  • 您可以根据步骤1中读取的内容计算新的统计信息
  • 您可以在输出时重新打开
    .csv
    文件,首先打印标题和统计信息,然后打印用于计算统计信息的所有其他数据行

  • Visual Basic 2008中的C++?这意味着什么?将输出吐入错误日志和统计数据,并最终合并这些文件。这是某种精灵@Jonathanwood请查阅以下内容:
    revind()
    ostream::seekp
    ostream::tellp
    @ThomasMatthews:Hi Thomas!谢谢你的建议!我尝试了所有这些功能,出于某种原因,它只会在完成所有操作后打印。我试着倒带(m_pDlg->sumLog),它在最后打印下一个东西。然后,fseek(m_pDlg->sumLog,0,SEEK_SET)仍然有相同的效果。这是一个很好的建议!非常感谢。但是,我想知道如果我在文件顶部留下一个空间让它被覆盖,会发生什么?是的,这种方法会奏效。只是A)你需要确保你留下足够的空间,B)要做到这一点,你可能会有太多的空间,以至于你的数据中有一堆空间。