C read file line by line

前端 未结 17 2168
后悔当初
后悔当初 2020-11-22 03:45

I wrote this function to read a line from a file:

const char *readLine(FILE *file) {

    if (file == NULL) {
        printf(\"Error: file pointer is null.\"         


        
相关标签:
17条回答
  • 2020-11-22 04:10
    void readLine(FILE* file, char* line, int limit)
    {
        int i;
        int read;
    
        read = fread(line, sizeof(char), limit, file);
        line[read] = '\0';
    
        for(i = 0; i <= read;i++)
        {
            if('\0' == line[i] || '\n' == line[i] || '\r' == line[i])
            {
                line[i] = '\0';
                break;
            }
        }
    
        if(i != read)
        {
            fseek(file, i - read + 1, SEEK_CUR);
        }
    }
    

    what about this one?

    0 讨论(0)
  • 2020-11-22 04:10

    I want a code from ground 0 so i did this to read the content of dictionary's word line by line.

    char temp_str[20]; // you can change the buffer size according to your requirements And A single line's length in a File.

    Note I've initialized the buffer With Null character each time I read line.This function can be Automated But Since I need A proof of Concept and want to design a programme Byte By Byte

    #include<stdio.h>
    
    int main()
    {
    int i;
    char temp_ch;
    FILE *fp=fopen("data.txt","r");
    while(temp_ch!=EOF)
    {
     i=0;
      char temp_str[20]={'\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0'};
    while(temp_ch!='\n')
    {
      temp_ch=fgetc(fp);
      temp_str[i]=temp_ch;
      i++;
    }
    if(temp_ch=='\n')
    {
    temp_ch=fgetc(fp);
    temp_str[i]=temp_ch;
    }
    printf("%s",temp_str);
    }
    return 0;
    }
    
    0 讨论(0)
  • 2020-11-22 04:13

    You should use the ANSI functions for reading a line, eg. fgets. After calling you need free() in calling context, eg:

    ...
    const char *entirecontent=readLine(myFile);
    puts(entirecontent);
    free(entirecontent);
    ...
    
    const char *readLine(FILE *file)
    {
      char *lineBuffer=calloc(1,1), line[128];
    
      if ( !file || !lineBuffer )
      {
        fprintf(stderr,"an ErrorNo 1: ...");
        exit(1);
      }
    
      for(; fgets(line,sizeof line,file) ; strcat(lineBuffer,line) )
      {
        if( strchr(line,'\n') ) *strchr(line,'\n')=0;
        lineBuffer=realloc(lineBuffer,strlen(lineBuffer)+strlen(line)+1);
        if( !lineBuffer )
        {
          fprintf(stderr,"an ErrorNo 2: ...");
          exit(2);
        }
      }
      return lineBuffer;
    }
    
    0 讨论(0)
  • 2020-11-22 04:19

    A complete, fgets() solution:

    #include <stdio.h>
    #include <string.h>
    
    #define MAX_LEN 256
    
    int main(void)
    {
        FILE* fp;
        fp = fopen("file.txt", "r");
        if (fp == NULL) {
          perror("Failed: ");
          return 1;
        }
    
        char buffer[MAX_LEN];
        // -1 to allow room for NULL terminator for really long string
        while (fgets(buffer, MAX_LEN - 1, fp))
        {
            // Remove trailing newline
            buffer[strcspn(buffer, "\n")] = 0;
            printf("%s\n", buffer);
        }
    
        fclose(fp);
        return 0;
    }
    

    Output:

    First line of file
    Second line of file
    Third (and also last) line of file
    

    Remember, if you want to read from Standard Input (rather than a file as in this case), then all you have to do is pass stdin as the third parameter of fgets() method, like this:

    while(fgets(buffer, MAX_LEN - 1, stdin))
    

    Appendix

    Removing trailing newline character from fgets() input

    how to detect a file is opened or not in c

    0 讨论(0)
  • 2020-11-22 04:20
    FILE* filePointer;
    int bufferLength = 255;
    char buffer[bufferLength];
    
    filePointer = fopen("file.txt", "r");
    
    while(fgets(buffer, bufferLength, filePointer)) {
        printf("%s\n", buffer);
    }
    
    fclose(filePointer);
    
    0 讨论(0)
  • 2020-11-22 04:20

    My implement from scratch:

    FILE *pFile = fopen(your_file_path, "r");
    int nbytes = 1024;
    char *line = (char *) malloc(nbytes);
    char *buf = (char *) malloc(nbytes);
    
    size_t bytes_read;
    int linesize = 0;
    while (fgets(buf, nbytes, pFile) != NULL) {
        bytes_read = strlen(buf);
        // if line length larger than size of line buffer
        if (linesize + bytes_read > nbytes) {
            char *tmp = line;
            nbytes += nbytes / 2;
            line = (char *) malloc(nbytes);
            memcpy(line, tmp, linesize);
            free(tmp);
        }
        memcpy(line + linesize, buf, bytes_read);
        linesize += bytes_read;
    
        if (feof(pFile) || buf[bytes_read-1] == '\n') {
            handle_line(line);
            linesize = 0;
            memset(line, '\0', nbytes);
        }
    }
    
    free(buf);
    free(line);
    
    0 讨论(0)
提交回复
热议问题