C ++ / CLI - URL Загрузить в файл - PullRequest
0 голосов
/ 23 сентября 2011

Я не совсем знаком с тем, как работает CLI, но у меня есть общее представление.У меня есть функция, которая принимает 2 переменные System :: String и использует их для загрузки файла с веб-страницы.Что касается загрузки, она работает нормально, и в моем каталоге появляется файл с необходимым содержимым.Тем не менее, это дает мне ошибку

Произошло необработанное исключение типа 'System.AccessViolationException' в ParseLinks.exe

void downloadFile(System::String ^_URL, System::String ^_saveAs)
{
    try
    {
        System::Net::WebClient ^webClient = gcnew System::Net::WebClient();
        // Downloads the resource with the specified URI to a local file.
        webClient->DownloadFile(_URL, _saveAs);
        webClient->Dispose();
    }
    catch (System::Exception ^_e)
    {
        // Error
        System::Console::WriteLine("Exception caught in process: {0}", _e);
    }
}

Я провел некоторое копание и тестирование выводаи обнаружил, что исполняемый файл достигает точки останова где-то в текстовом файле, поскольку вся веб-страница не сохранена в текстовый файл.

Соответствующий код для этого:

        if (myFile.is_open()) //if file open
        {
            while (!myFile.eof()) //before end of file
            {
                getline(myFile, ln);
                lines[count] = ln;
                count++; //count total lines to set loop length for later parsing
                //Error occurs somewhere in here
            }
            myFile.close();
        }
        else
            cout<<"Error: Could not access file\n";

Совершенно новая ошибка!: (

Необработанное исключение типа 'System.Runtime.InteropServices.SEHException' произошло в ParseLinks.exe

Код после файла -> цикл массива строк

myFile.close(); //Close txt file

            //Loop through lines
            for (int i = 0; i < count; i++)
            {
                string temp = parseLinks(lines[i]); //parse links from each line

Функция для этого:

string parseLinks(string str)
{
    const int len = str.length();
    string link;
    bool quotes = false, islink = false;
    string compare[5] = {".htm",".html",".php",".asp",".pdf"};

    //Parse all quoted text
    for (int i = 0; i != len; i++)
    {
        //Change bool if quote found
        if (str[i] == '"')
        {
            if (quotes == false)
                quotes = true;
            else
                quotes = false;
        }

        //If bool true, and char is not a quote, add to link string
        if (quotes == true && str[i] != '"')
            link += str[i];
    }

    //Discard non-link text
    for (int i = 0; i < 5; i++)
    {
        //Link check for links given array of path filetypes
        if (link.compare((link.length() - compare[i].length()),compare[i].length(),compare[i]) == 0)
            islink = true;
    }
    //Link check for links with no path filetype (.html, .php, etc.)
    if (link.compare(0,7,"http://") == 0)   
        islink = true;

    //If not a link, return empty string
    if (islink == false)
        link = "";

    return link;
}

Ошибка указывает на мое большое выражение сравнения в этой функции. (Кроме того, я явно ужасно сжимаю свой код)

1 Ответ

1 голос
/ 23 сентября 2011

Вы используете getline неправильно, и, возможно, это является причиной вашей ошибки.Правильная идиома:

std::string line;
while (std::getline(myFile, line))
{
  // process `line`
}

Нет необходимости проверять myFile на открытость отдельно.

...