standardowa biblioteka ma problem z otwarciem plików poprzez ifstream problem można rozwiązać poprzez skopiowanie pliku do katalogu tymczasowego aplikacji
problem ten będziemy rozwiązywać wraz z zadaniem ze zbioru maturalnego 65.3
kod pliku mainpage.xaml.cpp
używam nazwe projektu file_picker jeżeli wasz projekt nazywa się inaczej musicie zmienić file_picker na nazwę waszego projektu w wszystkich skopiowanych plikach
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 | #include "pch.h" #include "MainPage.xaml.h" #include <fstream> #include <iostream> #include <ppltasks.h> #include <pplawait.h> #include <winrt/Windows.Foundation.h> using namespace file_picker; using namespace concurrency; using namespace Platform; using namespace Windows::Foundation; using namespace Windows::Foundation::Collections; using namespace Windows::UI::Xaml; using namespace Windows::UI::Xaml::Controls; using namespace Windows::UI::Xaml::Controls::Primitives; using namespace Windows::UI::Xaml::Data; using namespace Windows::UI::Xaml::Input; using namespace Windows::UI::Xaml::Media; using namespace Windows::UI::Xaml::Navigation; using namespace Windows::Storage; using namespace Windows::Storage::Pickers; using namespace Windows::UI::Xaml; using namespace Windows::UI::Xaml::Controls; using namespace Windows::UI::Xaml::Navigation; MainPage::MainPage() { InitializeComponent(); } void file_picker::MainPage::click(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e) { FileOpenPicker^ openPicker = ref new FileOpenPicker(); openPicker->ViewMode = PickerViewMode::Thumbnail; openPicker->SuggestedStartLocation = PickerLocationId::Desktop; openPicker->FileTypeFilter->Append(".txt"); create_task(openPicker->PickSingleFileAsync()).then([this](StorageFile^ file) { if (file) { int num1, num2, result=0; String^ path_local = Windows::Storage::ApplicationData::Current->LocalFolder->Path; String^ path = Windows::Storage::ApplicationData::Current->LocalFolder->Path +"\"+ file->Name; std::wstring conv_1_a(path->Begin()); std::string conv_1_b(conv_1_a.begin(), conv_1_a.end()); std::wstring conv_2_a(path_local->Begin()); std::string conv_2_b(conv_2_a.begin(), conv_2_a.end()); std::ifstream in_file; do { in_file.open(conv_1_b); } while (!in_file.good()); for (int i = 0; i < 1000; ++i) { in_file >> num1; in_file >> num2; result += num1/nwd(num1, num2); } std::ofstream out_file(conv_2_b + "\\wynik.txt"); out_file << "wynik:" << result; Output1->Text = "number:"+result; Output2->Text = "scieżka pliku skopiowanego:"+path; in_file.close(); out_file.close(); } else { Output1->Text = "Operation cancelled."; } }); } int file_picker::MainPage::nwd(int a, int b) { if (b == 0) return a; return nwd(b, a % b); } |
interfejs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | <Page x:Class="file_picker.MainPage" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="using:file_picker" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"> <Grid> <StackPanel> <TextBlock Text="zadanie 63.5" FontSize="36"></TextBlock> <Button Height="150" Width="500" Click="click" FontSize="36">wybierz plik</Button> <TextBlock x:Name="Output1" Height="150" /> <TextBlock x:Name="Output2" Height="150" /> </StackPanel> </Grid> </Page> |
deklaracja funkcji w pliku nagłówkowym mainpage.xaml.h
wklejamy to zaraz pod znacznikiem „private:”
1 2 | void click(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e); int nwd(int a, int b); |