2010-10-22 112 views
2

我写了一个简单的程序来抓住雅虎财经的股票价格。读取数据的循环提前截断(并停止网站数据显示的位置,而不是完整下载到excell文件的正确日期)。所以我在循环中加入了一个cout命令来尝试调试,并且它正确地工作!Cout修复了C++程序中的错误,但是为什么?

那么为什么使用cout函数改变程序功能呢?有任何想法吗?以下是代码。 (我发现了两个相关的职位,但仍然无法数字出来,比如“可以清点以某种方式改变变量?”和“C++程序奇怪的错误:删除打印输出打破计划”)

#include <string> 
#include <iostream> 
#include <fstream> 
#include <algorithm> 
#include <windows.h> 
#include <wininet.h> 

using namespace std; 
int main() 
{ 
    HINTERNET hOpen, hURL; 
    LPCWSTR NameProgram = L"Webreader"; // LPCWSTR == Long Pointer to Const Wide String 
    LPCWSTR Website;      
    char file[101]; 
    int i; 
    string filename;   
    unsigned long read; 

    filename = "data.txt"; 
    ofstream myFile(filename); 
    if (! myFile) 
    { 
     cout < "Error opening file\n"; 
    } 
    if (!(hOpen = InternetOpen(NameProgram, INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0))) 
    { 
     cerr << "Error in opening internet" << endl; 
     return 0; 
    }      
    Website = L"http://ichart.finance.yahoo.com/table.csv?s=MSFT&a=00&b=1&c=2009&d=09&e=22&f=2010&g=d&ignore=.csv"; 
    hURL = InternetOpenUrl(hOpen, Website, NULL, 0, 0, 0); //Need to open the URL 
    InternetReadFile(hURL, file, 100, &read); 
    file[read] = '\0'; 
    myFile << file; 
    while (read == 100) 
    { 
     InternetReadFile(hURL, file, 100, &read); 
     file[read] = '\0'; 
     myFile << file; 
     cout << file; //If I take this line out, the function terminates early. 
    } 
    myFile << file; 
    InternetCloseHandle(hURL); 
    myFile.close(); 
    return 0; 
} 
+0

你确定这正是你的代码? 'cout <“Error ...”'看起来很可疑... – 2010-10-22 02:49:50

+0

你是对的,这是一个错误,但它在我的程序中(我不知道它为什么编译),所以我只是将它改为<<并仍然得到同样的问题,cout解决了另一个问题。 (感谢您注意!) – 2010-10-22 02:53:57

+0

编码提示:您可以通过使用do-while而不是常规while来将初始读取合并到循环中。 – chrisaycock 2010-10-22 02:58:35

回答

7

你有什么是“ Heisenbug“,当你试图找到它时会消失。没有错,问题仍然存在,你需要需要找到它。

第一个你应该做的事情是检查InternetReadFile的返回码。

此外,您应该而不是假定成功读取将返回完整的100个字节,即使将有更多。该doco状态:

,以确保所有数据被检索,应用程序必须继续调用InternetReadFile函数,直到函数返回TRUElpdwNumberOfBytesRead参数等于零。

:::

此外,转换线可能不完全填充缓冲器,所以InternetReadFile可以lpBuffer具有较少数据返回比请求。

换句话说,我想补充:

BOOL rc; 

,改变你的两个:

InternetReadFile(hURL, file, 100, &read); 

语句:

rc = InternetReadFile(hURL, file, 100, &read); 

那么你的循环变成:

while ((!rc) || (read > 0)) // I *think* that's right. 
+0

布拉沃!我改变了代码说 – 2010-10-22 03:02:39

+0

布拉沃!我改变了代码说(芦苇!= 0),它的工作!谢谢! – 2010-10-22 03:03:20

+2

+1对于Heisenbug – 2010-10-22 04:28:32

6

做一点输出可能需要一点时间,在这段时间内,数据可以从网络到达,准备在您下一次拨打InternetReadFile时读取数据。

我没有使用过这个野兽,但是如果它像其他读取函数一样工作,那么它不一定读取100个字节,它可能读取的东西更少。

如果是这样,那么请不要使用read == 100作为循环的延续条件。使用例如read > 0。但是请检查文档,它应该告诉你期望什么。

根据函数的低级别,也可能零字节的读取并不意味着完成。这可能是你需要检查返回值。并且例如在继续之前做一点延迟。

干杯&心连心,

+0

感谢你! (布拉沃!我改变了代码说,而(芦苇!= 0),它的工作!)(你们很棒!) – 2010-10-22 03:04:16

+0

@GaryWhite如果这解决了你的问题,你应该接受这个答案。 – 11684 2013-01-19 12:58:32

相关问题