我制作了一个程序,其功能是读取每天24小时每秒更新的.log文件。
我不会详细介绍该计划的工作方式,因为这将是一篇很长的文章,所以这里有一个摘要: -
我的计划的作用: -
1)有一个配置文件,用户可以更改变量,如time_interval等
2)用户放入5分钟(或者他们想要的频率)并运行我的程序,然后我的程序将在5分钟后扫描所述文本文件,然后在另外5分钟后再次扫描。
3)它检查文本文件中的某些标志,如果它改变值
则记录它4)然后将其打印成.csv文件
最后,这是一个程序,要求我简化数据库跟踪,以便在文本文件中记录其组件上的数据(通过/失败)
问题
这个程序在我制作的计算机上完美运行(Windows 7),我在另一台计算机上测试它以及运行Windows 2000。
当我将此程序传递给在Windows XP上运行它的客户端时,它似乎没有进入我设置它的while循环。
我的代码
void CSerco_Parser_ToolDlg::Read_Log()
{
int result;
char ReadLogLine[100000] = "";
CString LogPathName;
FILE *readLOG_fp;
LogPathName = Source_Folder + "\\Test.log";
readLOG_fp = fopen(LogPathName, "a+t");
MessageBox("Before While Loop");
while ((result = fscanf(readLOG_fp, "%[^\n]\n", ReadLogLine)) != EOF) // Loops through the fil till it reaches the end of file
{
CurrLine = ReadLogLine;
if ((first_run) && (first_run_check))
{
MessageBox("first run true, first run check true");
CurrLine_Final = CurrLine;
Sort_Array(); // I have MessageBoxes in this to tell me that I have went into this function
Comp_State(); // I have MessageBoxes in this to tell me that I have went into this function
}
else
{
MessageBox("not hitting anything");
}
}
fclose(readLOG_fp);
GenerateCSV(); // I have MessageBoxes in this aswell
}
排序数组功能
在这里我基本上将我从.log文件中读取的当前行排序到它自己的数组
Comp State功能
在这里,我将存储在数组中的值存储在Sort Array中并比较里面的值,如果不同,我将差异存储到另一个数组中进行打印
生成CSV功能
顾名思义,这是将差异打印到.csv文件中。
最终问题
当我在计算机上按照正常情况运行时,它会将所有差异完美地打印到.csv文件中,并显示我已正确设置的所有消息框。
但是当客户端在他的计算机上运行它时,它无法进入此循环
while ((result = fscanf(readLOG_fp, "%[^\n]\n", ReadLogLine)) != EOF)
并打印出来
MessageBox("Before While loop");
然后跳转到此功能
GenerateCSV();
并且因为它没有通过while循环,所以没有任何东西存储到数组中以便打印出来。因此,导致程序没有做任何事情。
问题
为什么要这样做?
它不应该是特定于操作系统的,因为我在较旧的操作系统上测试它与XP相比。
因为我确定它不是文件是空的。 (仔细检查,三重检查......)
它不是.log文件的路径名。 (再次加倍,三重检查等)
这不是由于特权(问我的客户有关)
我唯一可以想到的是,由于某种原因,它会进入.log文件并直接跳转到EOF。但是,当我在自己的计算机上测试它时,为什么它能正常工作。
答案 0 :(得分:1)
如果因为对while
的调用正在返回fscanf
而未进入EOF
循环,那么1>。
您是否检查过该电话:
readLOG_fp = fopen(LogPathName, "a+t");
实际上是返回有效的文件指针吗?如果是,那么首先检查文件是否为空。
您可能还想检查权限。日志文件可能存在,但您的程序可能无权打开它。