我有一个任务是在C中创建我自己的UNIX版本。我把这个任务分成了几个部分而我只是试图将文件名写入另一个文件(这将是我的存档文件)点。我可以创建文件,当我使用printfs确保从命令行获取正确的参数时,文件名是正确的。当我打开我创建的文件时,假设保存这些文件名,一切都是亚洲语言。
我已经研究过这个问题,并且没有找到太多进展。我找到的唯一一件事就是文件编码方式不同,但我现在很困惑。
#include <stdlib.h>
#include "ar.h"
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
int main (int argc, char **argv)
{
char *file_name, *archive_name;
size_t count = 50;
int i, fd, num_written;
//command line options to do later
//argv[1]
//get archive name
archive_name = argv[2];
//get file names to add to archive
for (i = 3; i<argc; i++)
{
file_name = argv[i];
}
//create archive file
fd = open(archive_name, O_RDWR |O_CREAT|O_APPEND);
if (fd < 0){
perror("Error while opening file.\n");
exit(EXIT_FAILURE);
}
else
printf("File %s opened successfully\n", archive_name);
//write file names into archive file
for (i = 3; i<argc; i++)
{
printf("file name: %s\n", argv[i]);
num_written = write(fd, argv[i], 50);
if (num_written == -1){
perror("Error while writing to archive.\n");
exit(EXIT_FAILURE);
}
}
close(fd);
return 0;
}
答案 0 :(得分:2)
您的代码假设归档名称后的所有参数都是50个字节。如果参数短于该参数,程序可能会崩溃或写入随机数据。由于它没有崩溃,而Notepad(或其他)似乎认为它是中文,我将假设它写了随机数据。使用strlen
计算每个参数名称的长度。
此外:
检查argv[2]
而不检查argv
,这可能会导致崩溃
你对file_name
所做的任何事都没有任何意义。