从文件读取并存储在具有读取功能的char数组中

时间:2017-01-15 10:36:29

标签: c string file

我想使用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;

}

1 个答案:

答案 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,否则会导致内存泄漏。您必须在程序结束时释放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;
}