我想使用read函数从文件中读取并将该文件的包含存储在chars数组中。我知道问题是我存储字符,我想打印一个字符串。我怎样才能获得我的字符串?
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#define MAX 1024
int main(int argc, char **argv)
{
int f1;
char *buf;
char *rez = (char*)malloc(sizeof(char)* MAX);
buf = (char*)malloc(sizeof(char)* MAX);
if((f1=open("fis4.txt", O_RDONLY )) < 0)
{
printf("Error\n");
exit(1);
}
int i = 0;
while((read(f1, &buf,1))>0)
{
rez[i]=buf[i];
i++;
}
printf("%s", rez);
close(f1);
return 0;
}
答案 0 :(得分:1)
您的代码中存在几个问题。首先,在while循环中,您需要测试i
是否大于MAX
,在这种情况下,您需要退出循环以避免缓冲区溢出。就像现在一样,如果文件长度超过1024个字符,它将崩溃,因为您正在尝试在数组外写入。为避免这种情况,请将此代码添加到while循环(i++
之后):
if(i + 1 >= MAX){
break;
}
break;
命令将退出while循环。
其次,字符串必须以空字符结尾。所以你必须在while循环之后为每个字符串添加一个空字符,如下所示:
rez[i] = '\0';
buf[i] = '\0';
请注意,在测试i
是否大于MAX
时,我们会if(i + 1 >= MAX)
而不是if(i >= MAX)
为空字符留出空间。
第三,永远不要使用malloc
而不使用free
,否则会导致内存泄漏。您必须在程序结束时释放rez
和buf
,如下所示:
free(rez);
free(buf);
替代方案适用于您的情况,但并非总是将rez
和buf
声明为简单数组而不使用malloc
:
char buf[MAX];
char rez[MAX];
这是有效的,因为MAX
是宏而不是变量。
首先,永远不要让指针未初始化。而是将其初始化为NULL
:
char *buf = NULL;
但是,在您的情况下,最好直接将其初始化为malloc
:
char *buf = (char*)malloc(sizeof(char) * MAX);
请注意,在C中,不需要也不建议转换malloc
的结果(尽管在C ++中是必需的)。因此,以下代码会更好:
char *buf = malloc(sizeof(char) * MAX);
有关详细信息,请参阅this。
第五,正如评论中所建议的那样,你必须检查来自malloc
的内存分配是否失败,在这种情况下你需要退出程序以避免未定义的行为。如果内存分配失败,则malloc
的返回值将为NULL
。这给出了这个代码,您应该放在malloc
之后:
if(rez == NULL || buf == NULL){
printf("Memory allocation failed.\n");
exit(8);
}
如果您想要关注standard return values,则此情况下的返回值为8。当然,如果您不想遵循标准,您可以返回您想要的价值。如果要遵循标准,如果找不到文件,则返回值也应为2(在代码中不是1)。您还可以使用宏ERROR_FILE_NOT_FOUND
(等于2)和ERROR_NOT_ENOUGH_MEMORY
(等于8)。这些宏可以在windows.h
中找到(虽然我不知道你是否有这个文件,因为你正在使用Linux)。
您的代码版本将起作用:
#include <stdio.h>
#include <stdlib.h>
#define MAX 1024
int main(int argc, char **argv){
FILE *f1;
char *buf = malloc(sizeof(char) * MAX);
char *rez = malloc(sizeof(char) * MAX);
if((f1=fopen("fis4.txt", "r" )) == NULL){
printf("Error\n");
exit(2);
}
if(rez == NULL || buf == NULL){
printf("Memory allocation failed.\n");
exit(8);
}
int i = 0;
while((buf[i] = fgetc(f1)) != EOF){
rez[i] = buf[i];
i++;
if(i + 1 >= MAX){
break;
}
}
rez[i] = '\0';
buf[i] = '\0';
printf("%s", rez);
free(rez);
free(buf);
fclose(f1);
return 0;
}