Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用c在桌面上创建文件_C_Windows_File_Desktop - Fatal编程技术网

如何使用c在桌面上创建文件

如何使用c在桌面上创建文件,c,windows,file,desktop,C,Windows,File,Desktop,如何在桌面上创建和操作文件,以及需要哪些库?只使用C,不使用C或C++。 我使用的是代码块,我使用的是allegro,这意味着我不能使用windows.h lib,程序需要在windows中运行。如果您使用的是windows,您需要查看它及其相关功能 文件的生命周期如下所示:您可以使用CreateFile创建它(或者,如果它存在,打开它),一旦创建/打开它,您就可以使用生成的文件句柄来操作它,并可能使用它。完成后,需要使用关闭句柄。1如果您使用的是Unix或类似Unix的系统,则可以调用 sys

如何在桌面上创建和操作文件,以及需要哪些库?只使用C,不使用C或C++。
我使用的是代码块,我使用的是allegro,这意味着我不能使用windows.h lib,程序需要在windows中运行。

如果您使用的是windows,您需要查看它及其相关功能


文件的生命周期如下所示:您可以使用
CreateFile
创建它(或者,如果它存在,打开它),一旦创建/打开它,您就可以使用生成的文件句柄来操作它,并可能使用它。完成后,需要使用关闭句柄。

1如果您使用的是Unix或类似Unix的系统,则可以调用

system("touch ~/Desktop/FILE");
在您的代码中,您需要
#包括

这将调用命令“touch~/Desktop/FILE”。如果要在此之后处理(读/写)文件,则必须使用正确的模式调用
fopen
。但是,如果您想在文件中写入内容,第二种方法要好得多


2你也可以使用

对于Unix或类似Unix的操作系统:
FILE*FILE=fopen(“~/Desktop/FILE”,“w+”)

对于Windows:
FILE*FILE=fopen(“C:\\Users\\YOUR\u USER\u NAME\\Desktop\\FILE”,“w+”)
(*假设您使用的是默认用户文件夹位置。)


这将创建文件,然后您可以在此之后读取/写入文件。确保使用了正确的模式。是
fopen
和模式的参考。请记住在Windows Vista或更高版本中包含

,使用
SHGetKnownFolderPath
查找桌面路径。您必须使用Unicode函数来获取文件路径,请使用
\u wfopen\u s
。您可以将ANSI写入文件,但建议写入UTF16或将文本转换为UTF8

#include <stdio.h>
#include <Windows.h>
#include <Shlobj.h>

int main()
{
    wchar_t *desktop;
    if(S_OK == SHGetKnownFolderPath(&FOLDERID_Desktop, 0, NULL, &desktop))
    {
        wprintf(L"Desktop path: %s\n", desktop);

        wchar_t filename[MAX_PATH];
        swprintf_s(filename, MAX_PATH, L"%s\\%s", desktop, L"file.txt");
        wprintf(L"Filename path: %s\n", filename);

        FILE *fp;
        _wfopen_s(&fp, filename, L"w");
        if(fp)
        {
            fprintf(fp, "Hello world\n");
            fclose(fp);
        }
        else
        {
            wprintf(L"can't create file\n");
        }

        CoTaskMemFree(desktop);
    }

    return 0;
}

那要看。。。您想使用Windows API(
CreateFile()
)、POSIX ish API(
\u open()
\u sopen\u s()
)还是ISO标准C(
fopen()
)?当然,您也可以使用第三方库,例如GLib,尽管您可能没有将它们安装在默认情况下编译器可以找到它们的位置,如果它们已经安装的话。我想使用fopen,我不能使用lib windows。h为什么我在程序中使用allegro。没有windows库和头文件,你无法编写windows程序。或者您需要跨平台解决方案。使用
allegro
标记询问有关allegro的问题。当我编译您的程序时,会出现FOLDERID_Desktop Undeclarate.@DavidAmatoMantegari在MinGW目标上,您应该在
knownfolders.h
头文件中找到它,该头文件自动包含在上面的
Windows.h
Shlobj.h
中。为了让
SHGetKnownFolderPath()
工作,我必须在任何其他include之前
\include
\define\u WIN32\u WINNT\u VISTA
,并在我的编译行末尾添加
-lole32
-luuid
,以链接找到符号所需的库。
#include <stdio.h>
#include <Windows.h>
#include <Shlobj.h>

int main()
{
    wchar_t desktop[MAX_PATH];
    if(SUCCEEDED(SHGetFolderPathW(NULL, CSIDL_DESKTOP | CSIDL_FLAG_CREATE, NULL, 0, desktop)))
    {
        wprintf(L"desktop: %s\n", desktop);
        wchar_t path[MAX_PATH];
        swprintf(path, L"%s\\%s", desktop, L"filename.txt");

        HANDLE handle = CreateFileW(path, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
        if(handle != INVALID_HANDLE_VALUE)
        {
            DWORD temp;
            const char *buf = "hello world";
            WriteFile(handle, buf, strlen(buf), &temp, NULL);
            CloseHandle(handle);
        }
        else
        {
            printf("can't create file\n");
        }
    }
    return 0;
}