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_File - Fatal编程技术网

C-将字符数组写入文件

C-将字符数组写入文件,c,file,C,File,我有以下结构: struct visitordata { char name[25]; char email[25]; int id; char reg_time[9]; }; 我想把这些访问者的数据写入一个文件。我正在从CLI读取以下数据: int main(int argc, char** argv) { struct visitordata mydata; char name[25], email[25], eventid[10], c;

我有以下结构:

struct visitordata {
    char name[25];
    char email[25];
    int id;
    char reg_time[9];
};
我想把这些访问者的数据写入一个文件。我正在从CLI读取以下数据:

int main(int argc, char** argv)
{
    struct visitordata mydata;
    char name[25], email[25], eventid[10], c;
    printf("Enter name: ");
    scanf("%s", name);
    strcpy(mydata.name, name);
    //etc.
}
现在,当我尝试写入文件时:

lseek(handle, -sizeof(mydata.name), SEEK_END);
fputs(handle, &mydata.name);  
这写入了用户提供的输入,但也有些胡言乱语,因为我分配了
char name[25]

从命令行读取后,如何分配字符数组大小?我对这很陌生,请不要太苛刻。谢谢大家!

使用
strlen(name)
获取名称中的字符数。

使用
strlen(name)
获取名称中的字符数

struct visitordata mydata;

memset(mydata, 0, sizeof mydata);

if (scanf("%24s %24s", mydata.name, mydata.email) == 2) {
    ...
}
memset
00
字节填充
mydata
,以便文件不包含随机数据

将数组传递给函数时,实际上只传递指向其第一个元素的指针,这正是
scanf
所期望的。请注意,要读取
int
,您必须编写:

if (scanf("%d", &mydata.id) == 1) {
    ...
}
memset
00
字节填充
mydata
,以便文件不包含随机数据

将数组传递给函数时,实际上只传递指向其第一个元素的指针,这正是
scanf
所期望的。请注意,要读取
int
,您必须编写:

if (scanf("%d", &mydata.id) == 1) {
    ...
}


你只为名字保留25个字符。如果用户输入较长,则写入的内存不是您的(缓冲区溢出)。在结构中,可以使用
mydata.name=new char(strlen(name)+1)
,来分配动态长度字符串。但是您也应该保证,不要从
name
中读取更多字符,因为您首先为它保留了字符。例如,使用
strncpy
而不是
strcpy
。也许可以多保留25个字符。还要确保字符串以“\0”结尾。如果可以的话,不应该在C中执行这些任务,因为你有很多机会击中自己的脚。考虑java或GO,它们保护您免受缓冲区溢出和其他内存损坏、格式化字符串攻击、堆分配错误等。一旦你有了更多的经验,如果你真的想的话,你可以切换到C。我必须用C来做…@RolandIllig-为什么建议使用一种不相关的语言?请告诉内核开发人员用java编写代码好吗?@cwschmidt好的,我可以将
mydata.name
分配为
newchar(strlen(name)+1)
。但在这种情况下,如何在结构中声明它?我不能做
charname[]在所有三个字符串上。另外,如何为
scanf(“%s”,name)声明
名称
这样它就和用户输入一样大了?您只为名称保留了25个字符。如果用户输入较长,则写入的内存不是您的(缓冲区溢出)。在结构中,您可以使用
mydata.name=newchar(strlen(name)+1)
分配动态长度字符串。但是您也应该保证,不要从
name
中读取更多字符,因为您首先为它保留了字符。例如,使用
strncpy
而不是
strcpy
。也许可以多保留25个字符。还要确保字符串以“\0”结尾。如果可以的话,不应该在C中执行这些任务,因为你有很多机会击中自己的脚。考虑java或GO,它们保护您免受缓冲区溢出和其他内存损坏、格式化字符串攻击、堆分配错误等。一旦你有了更多的经验,如果你真的想的话,你可以切换到C。我必须用C来做…@RolandIllig-为什么建议使用一种不相关的语言?请告诉内核开发人员用java编写代码好吗?@cwschmidt好的,我可以将
mydata.name
分配为
newchar(strlen(name)+1)
。但在这种情况下,如何在结构中声明它?我不能做
charname[]在所有三个字符串上。另外,如何为
scanf(“%s”,name)声明
名称
所以它和用户输入一样大?自从我声明它是
char-name[25]
以来,总共有25个。错了。如果
name
不是以null结尾,
strlen()
将不会返回正确的长度。最好强制
scanf()
只接受25个字符,包括空终止符。因为我声明它是
char name[25]
,所以将有25个字符。完全错误。如果
name
不是以null结尾,
strlen()
将不会返回正确的长度。最好强制
scanf()
只接受25个字符,包括空终止符。在这种情况下,您不希望用空值填充整个结构。里面有一个整数!此外,您的sizeof语法是错误的。你需要用括号来包装MyDATA。C++是无关的,但是文档只存在于C++中。我很想找到等价的C文档。我也删除了C++引用。这是该页最后的C文档,有一个指向C文档的链接。或者,您可以将URL中的
cpp
替换为
c
。在这种情况下,您不希望用空值填充整个结构。里面有一个整数!此外,您的sizeof语法是错误的。你需要用括号来包装MyDATA。C++是无关的,但是文档只存在于C++中。我很想找到等价的C文档。我也删除了C++引用。这是该页最后的C文档,有一个指向C文档的链接。或者,您可以将URL中的
cpp
替换为
c