如何使用SetFilePointer

时间:2015-06-24 16:34:11

标签: c++ csv

基本上,我正在为要记录失败和成功的一系列测试创建错误日志。错误日志是 .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,这是我的同事建议我尝试的,但它没有理解为什么它不能在我的代码中工作。 / p>

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始终等于INVALID_SET_FILE_POINTER。

更多信息:

m_pDlg->sumLog

这是我要写的文件的名称。在这个文件的末尾(可能大约1GB的数据),我试图开始插入这一行。 我已将其声明为

FILE* sumLog;

如果需要更多信息,我很乐意提供。

再次,非常感谢你!

2 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:0)

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

  1. 您在.csv中跳过统计信息行,并将其移至备用文件中。
  2. 您可以根据步骤1中的内容计算新统计信息。
  3. 您重新打开.csv文件作为输出首先打印标题和统计信息,然后打印用于计算统计信息的所有其他数据行