用C逐行读取但长度不正确

时间:2018-06-22 08:30:23

标签: c

我的代码从文件中读取一个字符串,并将其及其长度显示在屏幕上。但是长度不正确(大于1)。

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

int main() {

    FILE * file;
    file= fopen("data.txt","r");
    char* singleLine;
    singleLine = (char *) malloc(150* sizeof(char *));

    if(file){
        while(!feof(file)){
            fgets(singleLine,150, file);
            puts(singleLine);
            printf("length: %ld\n",strlen(singleLine));
        }
    }
    fclose(file);

    return 0;
}

2 个答案:

答案 0 :(得分:0)

  

fgets(char *s, int size, FILE *stream)从流中读取最多size-1个字符,并将它们存储到s指向的缓冲区中。   在EOF或换行符之后停止读取。 如果读取换行符,它将存储在缓冲区中。缓冲区的最后一个字符之后将存储一个'\ 0'。

如果一行的长度小于149个字节,并且不是文件的末尾,则换行符将被读取到buf。因此,strlen的返回值将包括换行符

另外:如果您只需要150个字符的缓冲区,而不是malloc(150* sizeof(char *)),则malloc(sizeof(char) * 150)可能更合理。

无需强制转换malloc的结果。有关详细信息,请问这个问题Do I cast the result of malloc?

答案 1 :(得分:0)

您可以通过以下方式摆脱换行符,该换行符会导致额外的长度:

#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#include <string>

int main()
{
    char* singleLine;

    FILE * file = fopen("data.txt","r");

    singleLine = (char *) malloc(150* sizeof(char));

    if(file)
    {
        char *p = NULL;

        while(fgets(singleLine, 150, file) != NULL) //giving the length here directly as 150 is important, because using sizeof() or strlen() only reads the 1st 3 characters(which is the size of char * on my platform) of the string.
        {
            p = strstr(singleLine,"\n");

            if(p)
            {
                *p = '\0';
            }
            printf("%s\n", singleLine);

            printf("length: %ld\n",strlen(singleLine));
        }
        if (feof(file))
        {
            fclose(file);   
        }
        else
        {
            printf("some other error occured");
        }
    }
    else
    {
        printf("inside else\n");
    }

    return 0;
}