本文介绍了与fgets没有完全填充数组的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想读一个文本文件并将其保存到一个数组数据[512]

I want to read a text file and store it into an array data[512].

下面是code:

char filename = "send.txt";

//Open File
FILE *in_file = fopen("send.txt", "r");

if(in_file == NULL){
    printf("Error : couldn't oepn file");
}

char data[512];
while(fgets(data, sizeof(data), in_file) != NULL){
    printf("read size: %d \n", strlen(data));
    ...
}

为什么 strlen的(数据)每次返回不同的值?为什么数据在没有完全填满?

Why does strlen(data) each time return a different value? Why is data in not fully filled?

修改

在使用 FREAD() A while循环中:

When using fread() inside a while loop:

printf("Start Reading \n" );
memset(&data[0], 0, sizeof(data));
size_t numRead = fread(data,1,sizeof(data),in_file);
printf("numRead: %d \n", numRead );
if(numRead == NULL)
{
    printf(" fread() failed\n");
    return 1;
}
printf("data size: %d \n", strlen(data));

数据大小(最后一行)是不正确的!

the data size (last line) is not correct!

样文本文件(这是确定所有除了第一个,其中的strlen 返回513而不是512):

Sample Textfile (it is ok for all except the first one where strlen returns 513 instead of 512):

电子Lorem存有EST simplement杜人造texte雇工丹斯香格里拉等组成濑拉带页前卫IM pression。乐Lorem存有EST乐人造texte标准DE L'IMPRIMERIE的起价莱années1500,quand联合国PEINTRE ANONYME assembla合奏德morceaux德texte倒réaliser联合国里弗标本德政策去texte。伊尔n'a PAS既成事实阙survivre五首siècles,MAIS s'est进行相反adapté点菜BUREAUTIQUE INFORMATIQUE,SANS阙儿子contenu n'en搜易得modifié。伊尔一ETEpopularisé丹斯莱années1960年恩典拉VENTE日弗耶Letraset contenant通道宫杜Lorem存有等,再加上récemment,票面儿子纳入丹斯DES应用濑德连接页面去texte,COMME奥尔德斯PageMaker.e Lorem存有EST simplement杜人造texte雇工丹斯香格里拉等组成濑拉带页前卫IM pression。乐Lorem存有EST乐人造texte标准DE L'IMPRIMERIE的起价莱années1500,quand联合国PEINTRE ANONYME assembla合奏德morceaux德texte倒réaliser联合国里弗标本德政策去texte。伊尔n'a PAS既成事实阙survivre五首siècles,MAIS s'est进行相反adapté点菜BUREAUTIQUE INFORMATIQUE,SANS阙儿子contenu n'en搜易得modifié。伊尔一ETEpopularisé丹斯莱années1960年恩典拉VENTE日弗耶Letraset contenant通道宫杜Lorem存有等,再加上récemment,票面儿子纳入丹斯DES应用濑德连接页面去texte,COMME奥尔德斯PageMaker.e Lorem存有EST simplement杜人造texte雇工丹斯香格里拉等组成濑拉带页前卫IM pression。乐Lorem存有EST乐人造texte标准DE L'IMPRIMERIE的起价莱années1500,quand联合国PEINTRE ANONYME assembla合奏德morceaux德texte倒réaliser联合国里弗标本德政策去texte。伊尔n'a PAS既成事实阙survivre五首siècles,MAIS s'est进行相反adapté点菜BUREAUTIQUE INFORMATIQUE,SANS阙儿子contenu n'en搜易得modifié。伊尔一ETEpopularisé丹斯莱années1960年恩典拉VENTE日弗耶Letraset contenant通道宫杜Lorem存有等,再加上récemment,票面儿子纳入丹斯DES应用濑德连接页面去texte,COMME奥尔德斯PageMaker.e Lorem存有EST simplement杜人造texte雇工丹斯香格里拉等组成濑拉带页前卫IM pression。乐Lorem存有EST乐人造texte标准DE L'IMPRIMERIE的起价莱années1500,quand联合国PEINTRE ANONYME assembla合奏德morceaux德texte倒réaliser联合国里弗标本德政策去texte。伊尔n'a PAS既成事实阙survivre五首siècles,MAIS s'est进行相反adapté点菜BUREAUTIQUE INFORMATIQUE,SANS阙儿子contenu n'en搜易得modifié。伊尔一ETEpopularisé丹斯莱années1960恩典拉VENTE日弗耶Letraset contenant通道宫杜Lorem存有等,再加上récemment,票面儿子纳入丹斯DES应用濑德连接页面去texte,COMME奥尔德斯PageMaker中。
乐Lorem存有EST simplement杜人造texte雇工丹斯香格里拉等组成濑拉带页前卫IM pression。乐Lorem存有EST乐人造texte标准DE L'IMPRIMERIE的起价莱années1500,quand联合国PEINTRE ANONYME assembla合奏德morceaux德texte倒réaliser联合国里弗标本德政策去texte。伊尔n'a PAS既成事实阙survivre五首siècles,MAIS s'est进行相反adapté点菜BUREAUTIQUE INFORMATIQUE,SANS阙儿子contenu n'en搜易得modifié。伊尔一ETEpopularisé丹斯莱années1960年恩典拉VENTE日弗耶Letraset contenant通道宫杜Lorem存有等,再加上récemment,票面儿子纳入丹斯DES应用濑德连接页面去texte,COMME奥尔德斯PageMaker.e Lorem存有EST simplement杜人造texte雇工丹斯香格里拉等组成濑拉带页前卫IM pression。乐Lorem存有EST乐人造texte标准DE L'IMPRIMERIE的起价莱années1500,quand联合国PEINTRE ANONYME assembla合奏德morceaux

e Lorem Ipsum est simplement du faux texte employé dans la composition et la mise en page avant impression. Le Lorem Ipsum est le faux texte standard de l'imprimerie depuis les années 1500, quand un peintre anonyme assembla ensemble des morceaux de texte pour réaliser un livre spécimen de polices de texte. Il n'a pas fait que survivre cinq siècles, mais s'est aussi adapté à la bureautique informatique, sans que son contenu n'en soit modifié. Il a été popularisé dans les années 1960 grâce à la vente de feuilles Letraset contenant des passages du Lorem Ipsum, et, plus récemment, par son inclusion dans des applications de mise en page de texte, comme Aldus PageMaker.e Lorem Ipsum est simplement du faux texte employé dans la composition et la mise en page avant impression. Le Lorem Ipsum est le faux texte standard de l'imprimerie depuis les années 1500, quand un peintre anonyme assembla ensemble des morceaux de texte pour réaliser un livre spécimen de polices de texte. Il n'a pas fait que survivre cinq siècles, mais s'est aussi adapté à la bureautique informatique, sans que son contenu n'en soit modifié. Il a été popularisé dans les années 1960 grâce à la vente de feuilles Letraset contenant des passages du Lorem Ipsum, et, plus récemment, par son inclusion dans des applications de mise en page de texte, comme Aldus PageMaker.e Lorem Ipsum est simplement du faux texte employé dans la composition et la mise en page avant impression. Le Lorem Ipsum est le faux texte standard de l'imprimerie depuis les années 1500, quand un peintre anonyme assembla ensemble des morceaux de texte pour réaliser un livre spécimen de polices de texte. Il n'a pas fait que survivre cinq siècles, mais s'est aussi adapté à la bureautique informatique, sans que son contenu n'en soit modifié. Il a été popularisé dans les années 1960 grâce à la vente de feuilles Letraset contenant des passages du Lorem Ipsum, et, plus récemment, par son inclusion dans des applications de mise en page de texte, comme Aldus PageMaker.e Lorem Ipsum est simplement du faux texte employé dans la composition et la mise en page avant impression. Le Lorem Ipsum est le faux texte standard de l'imprimerie depuis les années 1500, quand un peintre anonyme assembla ensemble des morceaux de texte pour réaliser un livre spécimen de polices de texte. Il n'a pas fait que survivre cinq siècles, mais s'est aussi adapté à la bureautique informatique, sans que son contenu n'en soit modifié. Il a été popularisé dans les années 1960 grâce à la vente de feuilles Letraset contenant des passages du Lorem Ipsum, et, plus récemment, par son inclusion dans des applications de mise en page de texte, comme Aldus PageMaker.Le Lorem Ipsum est simplement du faux texte employé dans la composition et la mise en page avant impression. Le Lorem Ipsum est le faux texte standard de l'imprimerie depuis les années 1500, quand un peintre anonyme assembla ensemble des morceaux de texte pour réaliser un livre spécimen de polices de texte. Il n'a pas fait que survivre cinq siècles, mais s'est aussi adapté à la bureautique informatique, sans que son contenu n'en soit modifié. Il a été popularisé dans les années 1960 grâce à la vente de feuilles Letraset contenant des passages du Lorem Ipsum, et, plus récemment, par son inclusion dans des applications de mise en page de texte, comme Aldus PageMaker.e Lorem Ipsum est simplement du faux texte employé dans la composition et la mise en page avant impression. Le Lorem Ipsum est le faux texte standard de l'imprimerie depuis les années 1500, quand un peintre anonyme assembla ensemble des morceaux

推荐答案

这是什么与fgets 做的:

C库函数的char *与fgets(的char * str中,整数N,FILE *流)读取指定的流,并将其存储一行到字符串str中所指向的。当任(N-1)字符被读取,换行字符被读取,或到达档案结尾停止,以先到者为准。

因此​​,在您code:

So in your code:

fgets(data, sizeof(data), in_file);

将读取的最多的511个字符,但它会停止阅读,一旦一个新行或EOF遇到。结果
如果你想阅读尽可能多的字符作为数据数组大,那么,无论是读逐一使用龟etc ,或拨打电话与fgets 在一个循环中,每次追加读取数据的其余部分数据的结尾。一个的未经检验的例子:

Will read at most 511 chars, but it'll stop reading once a new line or an EOF is encountered.
If you want to read as many chars as the data array is big, then either read them one by one, using fgetc, or call fgets in a loop, each time appending the rest of the read data to the end of data. An untested example:

size_t data_len = 0,
    total_len = 0,
    max_len = sizeof data/sizeof *data;//sizeof *data is one, unless you decide to use w_char or something
while ((fgets(data + data_len, max_len - data_len, in_file)) != NULL)
{
    data_len = strlen(data);
    if (data_len >= 511)//==511 should work, but you never know
    {
        total_len += data_len;//keep running total
        data_len = 0;
        printf("%s\n", data);
        data[0] = '\0';//make empty string
    }
}
if (data_len)
    printf("%s\nread size: %zu\n", data, total_len + data_len);

这篇关于与fgets没有完全填充数组的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

09-02 21:27