首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何将char数组的内容读写到文件中?

如何将char数组的内容读写到文件中?
EN

Stack Overflow用户
提问于 2010-01-07 00:49:51
回答 3查看 2.7K关注 0票数 0

此程序接受用户输入并保存到char数组中。然后创建一个文件并将这些文本放到新文件中。问题是,它只能复制空格之前的部分。当前输出:“如何阅读”-->“如何阅读”

代码语言:javascript
运行
复制
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>

int main(int argv, char *argc[]){
    int fd;
    char buffer[100];

    printf("Type your text : ");
    scanf("%s",&buffer);

    fd=open("menew.txt",O_CREAT|O_WRONLY|O_EXCL,S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH);
    if(fd<0){
        printf("file already exist!\n");
        }else printf("file created!\n");

    fd=write(fd,buffer,20);
    if(fd<0){
        printf("error on writing...\n");
        }else printf("successfully written!\n");

    close(fd);
    return 0;
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-01-07 01:43:34

我终于找到了解决方案!使用scanf("%s",&buffer);gets(buffer);实例

票数 0
EN

Stack Overflow用户

发布于 2010-01-07 00:55:10

问题不在于写入,而在于读取-- scanf %s转换跳过任何前导空格,然后读取并转换到(但不包括)下一个空格。

您可能希望使用类似fgetsscanf%[^\n]转换。

编辑:我可能还应该提到,当您使用扫描集转换(%[^\n])时,您应该指定正在读入的缓冲区的长度。

至于scanf("%s", &buffer);中的&buffer是一个错误,从技术上讲,它确实提供了未定义的行为,但在现实中,我不知道有什么实现能真正起到作用。

在本例中,buffer被定义为数组,而不是指针。在许多情况下,数组的名称会“衰减”为指针,但当用作address-of运算符(一元&)的操作数时则不会。因此,buffer&buffer产生完全相同的结果,即数组开头的地址。

尽管如此,还是有区别的。当您只使用buffer时,您将获得一个类型为pointer to char的值(假设该缓冲区是一个字符数组)。当你使用&buffer时,你会得到一个pointer to array of MAXLEN char类型的指针。

现在,当您将一个值传递给scanf (一个可变函数)时,当您传递的值的类型与您指定的转换所期望的类型不匹配时,您会得到未定义的行为。实际上,对于我听说过的每一个C编译器,它都会工作得很好,因为无论哪种方式都会传递相同的地址。在理论上(但仅在理论上,AFAIK)编译器可以使用某种类型的“胖指针”,包括类型信息和地址,因此scanf将能够检测到类型不匹配。实际上,我不知道有哪个编译器会做类似的事情,所以在这种情况下,您不会看到只使用buffer和使用&buffer有什么不同。

然而,在其他情况下,这种差异是可以检测到的。指针上的加法和减法是基于类型的,因此(例如) array+1&array + 1将产生不同的结果:

代码语言:javascript
运行
复制
#include <stdio.h>

int main() { 
    char array[10];

    printf("%p %p %p\n", array, array+1, &array+1);
    return 0;
}

这将打印三个数字。第一个数字是一些任意的数字,通常是十六进制的。第二个数组将比第一个数组大1,第二个数组将比第一个数组大10 (因为我将其定义为一个包含10个字符的数组……)

票数 5
EN

Stack Overflow用户

发布于 2010-01-07 00:57:53

至少一个错误:

代码语言:javascript
运行
复制
scanf("%s",&buffer);

应该是:

代码语言:javascript
运行
复制
scanf("%s", buffer);

你正在获取一个指针的地址。可能不是你想要的。

编辑:

scanf也有曾傑瑞·科芬所描述的局限性。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2014577

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档