我正在尝试创建一个获取参数的脚本,为每个参数创建一个以该参数作为内容的文件。
#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 个:
-
如果您想使用
filename
不能是char *
。它需要一个有效的内存缓冲区。- 您需要使用
/
而不是//
。 - 写入文件后需要使用
CloseHandle()
来关闭文件。 - 对于
WriteFile()
,lpNumberOfBytesWritten
不能为NULL
。 - 始终检查文件是否正确打开。
sprintf
,这是我能想到的最简单的代码:
#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/