嘿,我想对我对C语言使用的旧知识进行一些回顾。我想为C字符串分配内存然后写入此缓冲区或从此缓冲区读取C字符串。我记得有什么像' \ 0'在每个字符数组的末尾表示C字符串。
总是将字符串分配为(STRLEN + 1)并在读取或写入时(文件,套接字等)执行相同操作也是正确的。
char *myCString = malloc(sizeof(char)*(STRLEN+1))
read(fd, buff, STRLEN+1);
write(fd, buff, STRLEN+1);
感谢您澄清此问题。
答案 0 :(得分:1)
你或多或少是正确的。我对这段代码的说明
char *myCString = malloc(sizeof(char)*(STRLEN+1))
这确实分配了STRLEN + 1字节的缓冲区(如果sizeof(char)是一个字节)。 STRLEN应该是您期望读取的最大字节数。编译器可能会抱怨,因为malloc返回一个void *类型,并将它存储在char *中。在malloc调用中添加(char *)类型转换。
read(fd, buff, STRLEN+1);
这将从文件句柄fd中将最多(STRLEN + 1)个字节读入缓冲区,称为“buff”。除了你已经调用缓冲区'myCString'之外,这是好的。但是,此读取不会在从文件读取的字符末尾添加“\ 0”,并且不会在行尾停止。
如果您正在尝试读取和写入行,那么我建议您阅读有关fopen / fclose / fprintf / fputs / fscanf / fgets的内容。这些是用于对文件执行字符串IO的传统C库函数。
write(fd, buff, STRLEN+1);
无论字符串在缓冲区中的长度如何,都会将(STRLEN + 1)字节写入文件。
例如,假设STRLEN = 7(所以你有8个字符的缓冲区)。我们假设您在缓冲区中有“HELLO”这个词。
记忆将是:
0 1 2 3 4 5 6 7
H E L L O \0 ?? ??
??表示该记忆可能有任何价值。
如果我'写(fd,buf,8)',那么它会将所有8个字节写入文件。该文件将以:
结束H E L L O \0 ?? ??
我希望你宁愿在文件中有5个字节(H E L L O)
作为阅读的一个例子,假设你有一个包含2行的文件,带有unix文件结尾。它可能看起来像:
H E L L O \n W O R L D \n
(其中\ n =新行字符)
请注意文件中没有\ 0字符。 \ 0作为缓冲区终止符是C的东西,并且在文件中没有模拟。
如果我确实'读过(fd,buf,8),那么我的缓冲区将以:
结束H E L L O \n W O
读取8个字符,字符串末尾没有'\ 0'。如果我试图打印它然后我会失败,因为没有\ 0。
正确的函数是fgets和fputs,它们将读取和写入字符串,并考虑到\ n。