gpt4 book ai didi

c - 使用 read 函数从文件读取并存储在 char 数组中

转载 作者:行者123 更新时间:2023-11-30 20:21:43 28 4
gpt4 key购买 nike

我想使用读取函数读取文件并将该文件的内容存储在字符数组中。我知道问题是我存储字符并且我想打印字符串。我怎样才能获得我的字符串?

#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;

}

最佳答案

您的代码中有几个问题。首先,在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) 为空字符留出空间。

第三,切勿在没有free的情况下使用malloc,否则会导致内存泄漏。您必须在程序末尾释放 rezbuf,如下所示:

free(rez);
free(buf);

另一种适用于您的情况但并非总是如此的替代方案是将 rezbuf 声明为简单数组而不使用 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;
}

关于c - 使用 read 函数从文件读取并存储在 char 数组中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41660167/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com