2017-03-14 8 views
0

デスクトップに簡単なテキストファイルを作成しようとしていますが、コンソールに「アクセスが拒否されました。」と表示されます。私はComand Lineから同じことをしてエラーはありません。私はパスを印刷する場所ならば、私はなるだろう: 「C++マージ2文字列を一緒に

C:/ユーザ/アレックス /Desktop/MyTextFile.txt

私が追加したときに、私が知っている(ここでは、新しいラインです) + =文字列を経由して別の文字列に文字列、私は2列の間のスペースを得ることができます。すべてのヘルプはapreciateだろう!

string getClip() { 
    HANDLE clip; 
    string clip_text = ""; 
    if (OpenClipboard(NULL)) 
    { 
     clip = GetClipboardData(CF_TEXT); 
     clip_text = (char*)clip; 
     CloseClipboard(); 
     return clip_text; 
    } 
} 
string getUser() { 
    system("echo %username% | clip"); 
    string user = getClip(); 
    return user; 
} 
void create_a_simple_txt_file() { 
    string username = getUser(); 

    ostringstream path; 
    path << "C:/Users/" << username << "/Desktop/MyTextFile.txt"; 
    system(("echo I successful Write something to my file > " + path.str()).c_str()); 

} 

int main() { 
    create_a_simple_txt_file(); 
    cin.get(); 
    return 0; 
} 
+3

ポスト 'のgetUser()'コード – Rama

+0

。ユーザー名は、そのユーザーとしてログインしていない限り、権限がないユーザーである可能性があります。 –

+0

@Ramaこのコードを使用すると、** Acces Deniel **のようなエラーが表示されますか? –

答えて

3

問題はsystemの使用状況やechoコマンドです:

system("echo %username% | clip"); 

echoコマンドclipコマンドでクリップボードにコピーされた末尾の改行を、追加し、あなたがしてフルを取得文字列は改行を含めてgetClipです。

あなたは、単にすべてでsystemを使用しないことにより、これを修正し、代わりにGetUserName Windows API関数を使用して、ユーザ名を取得することができます:あなたはゴミに取り組んでいるので、

std::string getUser() 
{ 
    char username[64]; 

    // Use the ASCII version of the function 
    if (GetUserNameA(username, sizeof username)) 
    { 
     return username; 
    } 

    // An error 
    std::cerr << "Error getting username: " << GetLastError() << '\n'; 
    return ""; 
} 
+0

私はより良い解決策を見つけました。新しい行なしで印刷するには、** echo | set/p =%Username%**を使用できます。 –

+0

@AlexM。なぜあなたは 'system'と外部コマンドの使用を主張していますか?単にそれを必要としないのですか? –

+1

@AlexM .: "Better"はかなり議論の余地があります。 – Pixelchemist

1

私はあなたの問題が012である賭けるだろう関数は、文字列の連結ではなく、末尾の改行でユーザ名を返しています(つまり、空白を追加しません)。
私はなっているように、問題はあなたのgetUser()関数であり、あなたが実行している場合、それは、間違っていると可能な解決策である理由について、「いくつかのプログラマーの男」の回答を参照してください。編集中の質問後に編集

Windows OS。

別の問題は、別のユーザーのデスクトップフォルダにアクセスしようとしていて、プログラムを実行しているユーザーにアクセス権がないことです。

別の提案:system()ではなく、適切なC++関数またはfstreamを使用してファイルに書き込むことをお勧めします。

1

あなたはアクセスを取得しているがエラーを否定データ。行

system(("echo I successful Write something to my file > " + path.str()).c_str()); 

は、一時的な文字列を作成し、その基礎となる文字配列へのポインタを取得します。しかし、system()呼び出しが実行される前に、一時文字列が破棄され、ポインタが無効になります。

システムコールをcoutに置き換えると、実際に実行しようとしているコマンドがわかります。私にとってはÓ╣iwµのようなもので、有効なコマンドでもなく、有効なディレクトリ名でもありません。したがって、アクセスは拒否されました

、その問題を解決し、あなたがそれを使用しているまで、変数への一時的な文字列を割り当てるには、次のメッセージは、Windowsから来ている

string s = ("echo I successful Write something to my file > " + path.str()); 
system(s.c_str()); 
関連する問題