-1

私は一日中私を狂わせている単純な問題を抱えています。現在のユーザーの名前を知らずに、現在のユーザーのデスクトップでファイルを開こうとしています。

アイデアは、APIへのGetCurrentUser呼び出しを使用してユーザー名を取得することです。次に、文字列をフォーマットしてフルパスディレクトリを指定し、その変数をfopenに渡してファイルを開きます。これが私が取り組んでいるコードです。コンパイラエラーは発生せず、正常にコンパイルされますが、ファイルへの書き込みはありません。

int main() {

  char pathName[200]; // declaring arrays

  char userName[100];

  DWORD userNameSize = sizeof(userName); // storage for user name

  if (!GetUserName(userName, &userNameSize)) { cout << "user not found"; }

  else { cout "hello" << userName;} // error checking


  // format for Windows 7 desktop
  sprintf(pathName, "\"C:\\Users\\%s\\Desktop\\text.txt\"", userName); 

  cout << pathName << "\n"; // confirms correct location

  const char* fileLocation = pathName; // pointer to full path to pass into fputs

  const char* test = "test";  // test information to write to file to confirm

  FILE *f = fopen(fileLocation,"a+"); // open file in append mode

  fputs(test, f); // write to file

  fclose(f); // flush and exit

  return 0;
}

文字列をフォーマットするために別の呼び出しを使用する必要があるかもしれませんか?または、fileLocationを別の変数タイプとして宣言しますか?

私はC++にかなり慣れていないので、現在のユーザーのデスクトップでファイルを開くのに役立つヒントをいただければ幸いです。ありがとう。

ジェリーのアドバイスに応じて編集:

これは私の最新のコメントが言及していたものです:

#include <iostream>
#include <cstring>
#include <string>
#include <conio.h>
using namespace std;

string location ("C:\\Users\\testuser\\Desktop\\log.dat");

char cstr = char* [location.size()]; //This is a problematic line

strcpy (cstr, location.c_str());

void write(const char* c)
{
    const char* fileLocation = cstr;
    //const char* fileLocation = g_pathName;
    FILE *f = fopen(fileLocation,"a+"); // This is the problematic line right here. 
    if(f!=NULL)
    {
        fputs(c,f); // append to end of file 
        fclose(f);  // save so no entries are lost without being flushed
        }
}


int main ()
{  
  write("test");

  cout << "done";

  _getch();

  return 0;
}
4

3 に答える 3

2

9行目にセミコロンがありません。

...{ cout << "user not found" }...

C ++ではセミコロンはオプションではありません。プログラムを実行するには、セミコロンが必要です。また、コメントに記載されているように、ファイル名を引用符で囲む必要はありません。

于 2012-09-17T20:47:00.030 に答える
1

からSHGetSpecialFolderPathを使用しますshlobj.h

const char *szFileName = "text.txt";
const char *szContent = "test string";

char szPath[_MAX_PATH];

SHGetSpecialFolderPath(NULL, szPath, CSIDL_DESKTOPDIRECTORY, FALSE);

strcat(szPath, "\\");
strcat(szPath, szFileName);

FILE *pFile = fopen(szPath, "a+");

if(pFile != NULL)
{
    fputs(szContent, pFile);
    fclose(pFile);
}
于 2012-09-17T22:12:51.307 に答える
0

FOLDERID_DesktopSHGetKnownFolderPathでデスクトップへのパスを取得し、最後にファイル名を追加します。また、ほぼ確実にstd::stringsを操作する必要があります。フルネームを作成したら、.c_strメンバー関数を使用して名前をCスタイルの文字列として取得します。特に特別な理由がない限り、Cスタイルの代わりに使用する方がよいでしょう(その場合、コンパイラが最新の場合は、オブジェクトを名前として直接渡すことができます)。std::ofstreamFILE *std::string

編集:ユーザーのデスクトップ上のファイルの作成と書き込みに関する簡単なデモコード:

#include <windows.h>
#include <Shlobj.h>
#include <objbase.h>
#include <string>
#include <fstream>

#pragma comment(lib, "ole32.lib")
#pragma comment(lib, "shell32.lib")

std::string GetKnownFolderPath(REFKNOWNFOLDERID f) {
    PWSTR sys_path;

    SHGetKnownFolderPath(f, 0, NULL, &sys_path);

    DWORD size = WideCharToMultiByte(CP_ACP, 0, sys_path, -1, 0, 0, NULL, NULL);

    std::string path(size, ' ');

    WideCharToMultiByte(CP_ACP, 0, sys_path, -1, &path[0], size, NULL, NULL);

    // We're finished with the string the system allocated:
    CoTaskMemFree(sys_path);

    // WideCharToMultiByte leaves space for a NUL terminator we don't need
    path.resize(path.size()-1);   
    return path;
}

int main() {
    std::string path(GetKnownFolderPath(FOLDERID_Desktop));

    path += "\\test.txt";

    std::ofstream test(path.c_str());

    test << "This is a test";

    return 0;
}
于 2012-09-17T20:47:29.127 に答える