c - 为什么c中的createfile函数停止for循环

标签 c winapi

我正在尝试创建一个获取参数的脚本,为每个参数创建一个以该参数作为内容的文件。

#include <stdio.h>
#include <windows.h>

int main(int argc, char *argv[]){
    HANDLE hfile;
    char *filename;
    char *data;
    for(int i=1; i<argc; i++){
        data = argv[i];
        printf(data);
        sprintf(filename, "C://temp//%d.txt",i);
        printf(filename);
        hfile = CreateFile(
            filename,
            GENERIC_WRITE,  
            0,
            NULL,
            OPEN_ALWAYS,
            FILE_ATTRIBUTE_NORMAL,
            NULL
        );
        printf("asdasd");
        BOOL writetofile;
        writetofile = WriteFile(
            hfile,
            data,
            strlen(data),
            0,
            NULL
        );
        printf("done");
    }
}

调试后,正如您在 printfs 中看到的那样,脚本仅运行循环一次。 命令行:

./a.exe a b c d

输出:

a

最佳答案

有几个问题。这是我的头顶上的 5 个:

    如果您想使用 sprintf
  1. filename 不能是 char *。它需要一个有效的内存缓冲区。
  2. 您需要使用 / 而不是 //
  3. 写入文件后需要使用CloseHandle()来关闭文件。
  4. 对于 WriteFile()lpNumberOfBytesWritten 不能为 NULL
  5. 始终检查文件是否正确打开。

这是我能想到的最简单的代码:

#include <stdio.h>
#include <windows.h>

int main(int argc, char *argv[]){
    HANDLE hfile;
    char filename[50] = {0,};
    char *data;
    for(int i=1; i<argc; i++){
        data = argv[i];
        printf(data);
        sprintf(filename, "C:/temp/%d.txt",i);
        printf(filename);
        hfile = CreateFile(
            filename,
            GENERIC_WRITE,  
            0,
            NULL,
            OPEN_ALWAYS,
            FILE_ATTRIBUTE_NORMAL,
            NULL
        );

        printf("asdasd");
        if (hfile != INVALID_HANDLE_VALUE) {
            DWORD writtenSize = 0;
            BOOL writetofile = WriteFile(
                hfile,
                data,
                strlen(data),
                &writtenSize,
                NULL
           );

           if (writetofile) {
               printf("write done.");
           }

           CloseHandle(hfile);
        }

        printf("done");
    }
}

尽管对文件名使用固定缓冲区大小可能不是一个好主意,但我认为我纠正了大部分代码错误。

关于c - 为什么c中的createfile函数停止for循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59154021/

相关文章:

c - Realpath 要求文件存在

c++ - 如何编写命令行 shell 来捕获 'UP' 键以获取历史输入?

c++ - open( char *filename, int access, int Permission) 在哪里定义的?

windows - 创建目录并通过发出一个 IRP 获取句柄

无法检索编辑控件中文本的长度

c++ - 如何找出文件所在的物理驱动器?

c - 如何在c中为未知字符串长度分配内存

C 从文件中读取特定行

win32gui 中的 Python PyHANDLE 对象

perl - 宽字符和 win32::api