2

我编写了一个简单的程序来从雅虎财经获取股票价格。读取数据的循环提前截断(并结束网站数据显示的位置,而不是完整下载到 Excel 文件的正确日期)。所以我在循环中放入了一个 cout 命令来尝试调试和瞧,它工作正常!

那么为什么使用 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;
}
4

2 回答 2

7

你所拥有的是一个“Heisenbug”,当你试图找到它时它就会消失。毫无疑问,问题仍然存在,您确实需要找到它。

您应该做的第一件事是检查InternetReadFile.

此外,您不应假设成功读取将返回完整的 100 个字节,即使还有更多字节。该文档指出:

为确保检索到所有数据,应用程序必须继续调用该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.
于 2010-10-22T02:49:48.470 回答
6

做一些输出可能需要一点时间,在此期间数据可以从网络到达,准备好在您下次调用InternetReadFile.

我没有使用过那个野兽,但如果它像其他读取功能一样工作,那么它不一定读取 100 个字节,它可能会读取更少的内容。

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

根据该功能的底层程度,读取的零字节也可能并不意味着完成。可能是您需要检查返回值。例如,在继续之前做一点延迟。

干杯&hth.,

于 2010-10-22T02:56:58.253 回答