MFC C ++当我有权访问文件时,始终返回EOF

时间:2014-03-13 10:06:54

标签: c++ mfc eof

我目前陷入了这个问题,我无法解决这个问题。这是关于我之前在这里问过的上一个问题。但我会再次重申,因为我发现了问题但却无法解决问题。

我的程序访问一个每隔一天24小时不间断更新的文本文件。它逐行抓取数据并对每一行进行比较。如果有任何事情是“错误”(由我定义),那么我将该数据记录到.csv文件中。该程序可以定时(用户定义)运行。

我的问题是这个程序在我的计算机上运行得很好,但它并没有在我的客户端计算机上运行。我调试了程序,这些是我的发现。以下是我尽可能减少解释过程的代码

int result;
char ReadLogLine[100000] = "";
FILE *readLOG_fp;
CString LogPathName;
LogPathName = Source_Folder + "\\serco.log"; //Source_Folder is found in a .ini file. Value is C:\\phython25\\xyratex\\serco_logs   
readLOG_fp = fopen(LogPathName, "r+t"); 
while ((result = fscanf(readLOG_fp, "%[^\n]\n", ReadLogLine)) != EOF) // Loops through the file till it reaches the end of file
{
    Sort_Array(); // Here is a function to sort the different lines that I grabbed from the text file
    Comp_State(); // I compare the lines here and store them into an array to be printed out
}
fclose(readLOG_fp);

GenerateCSV(); // This is my function to generate the csv and print everything out

在Sort_Array()中,我对从文本文件中抓取的行进行排序,因为它们可能具有不同的性质。例如,

CStringArray LineType_A, LineType_B, LineTypeC, LineTypeD;
if (ReadLogLine == "Example line a")
{
    LineType_A.add(ReadLogLine);
}
else if (ReadLogLine == "Example line b")
{
    LineType_B.add(ReadLogLine);
}

等等。

在CompState()中,我比较每个LineType数组中的不同值,看看是否有任何差异。如果它不同,那么我将它们存储在一个单独的数组中进行打印。一个简单的例子就是。

CStringArray PrintCSV_Array;

for (int i = 0; i <= LineType_A.GetUpperBound(); i++)
{    
    if (LineType_A.GetAt(0) == LineType_A.GetAt(1))
    {
        LineType_A.RemoveAt(0);
    }
    else 
    {
        LineType_A.RemoveAt(0);
        PrintCSV_Array.Add(LineType_A.GetAt(0);
    }
}

这样我在数组中没有无限量的数据。

现在,对于GenerateCSV函数,它只是一个普通函数,我创建.csv文件并打印PrintCSV_Array中的任何内容。

现在问题。在我客户的计算机中,似乎没有向CSV打印任何内容。我调试了程序,发现它一直在失败。

while ((result = fscanf(readLOG_fp, "%[^\n]\n", ReadLogLine)) != EOF) // Loops through the file till it reaches the end of file
{
    Sort_Array(); // Here is a function to sort the different lines that I grabbed from the text file
    Comp_State(); // I compare the lines here and store them into an array to be printed out
}
fclose(readLOG_fp);

它进入了while循环,因为我在实际程序中进行了一些错误检查。它进入while循环的那一刻就突破了它,这表明我出于某种原因它达到了EOF。当发生这种情况时,程序没有机会同时进入Sort_Array和Comp_State函数,因此给我一个空白的PrintCSV_Array并且没有任何内容可以打印出来。

我检查过的是

  1. 我绝对可以访问该文本文件。

  2. 我的想法是因为文本文件每次更新 毫秒,它可能已经被其他程序打开了 进入它,因此不给我访问或文本文件始终在 一个fopen状态因此不保存任何数据供我阅读。一世 测试了这个,程序有增值,因为我看到KB的 在我眼前加起来。

  3. 我尝试复制文本文件并将其粘贴到其他地方 程序阅读,这样我绝对可以完全访问它和 一旦我完成它,我删除它。这给了我什么都不打印 以及。

  4. 我是否正确地推断它总是给我EOF因此这是 遇到问题。

    while((result = fscanf(readLOG_fp,“%[^ \ n] \ n”,ReadLogLine))!= EOF)//循环文件,直到到达文件末尾

  5. 如果是,我该如何解决?我可以通过其他方式阅读每一行。我已经认真地用尽了所有关于这个问题的想法,并且需要一些帮助。

    感谢大家的帮助。

1 个答案:

答案 0 :(得分:3)

错误非常明显......你可能已经看过了.. 你忘了打开文件。

FILE *readLOG_fp;
CString LogPathName;
LogPathName = Source_Folder + "\\serco.log";

readLOG_fp = fopen(LogPathName.GetBuffer());
if(readLOG_fp==NULL)
  cout<<"Error: opening file\n";