Gaarsin
Gaarsin

Reputation: 33

Ignoring \n when reading from a file in C?

I was wondering if it is possible to ignore the new lines when reading a file. I've written a little program that reads the characters from a file and formats them but the new lines in the document mess up the formatting, I end up with double spaces where I only want a single spacing.

Is it possible to disable this feature? So that the only new lines my program prints out are the new lines that I insert into the print functions in my program?

Upvotes: 1

Views: 5585

Answers (2)

Carlo Nervi
Carlo Nervi

Reputation: 11

I come across this old topic. My way to ignore '\n' is:

#include <string.h>
#include <stdio.h>
#define MAX_LENGTH 512

char *line, *tok;
FILE *file;

  fgets(line, MAX_LENGTH, file);
  tok = strchr(line, '\n');
  if (tok) *tok = '\0';

Upvotes: 0

Schwern
Schwern

Reputation: 165446

C doesn't provide much in the way of conveniences, you have to provide them all yourself or use a 3rd party library such as GLib. If you're new to C, get used to it. You're working very close to the bare metal silicon.

Generally you read a file line by line with fgets(), or my preference POSIX getline(), and strip the final newline off yourself by looking at the last index and replacing it with a null if it's a newline.

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

char *line = NULL;
size_t line_capacity = 0; /* getline() will allocate line memory */

while( getline( &line, &line_capacity, fp ) > 0 ) {
    size_t last_idx = strlen(line) - 1;

    if( line[last_idx] == '\n' ) {
        line[last_idx] = '\0';
    }

    /* No double newline */
    puts(line);
}

You can put this into a little function for convenience. In many languages it's referred to as chomp.

#include <stdbool.h>
#include <string.h>

bool chomp( char *str ) {
    size_t len = strlen(str);

    /* Empty string */
    if( len == 0 ) {
        return false;
    }

    size_t last_idx = len - 1;
    if( str[last_idx] == '\n' ) {
        srt[last_idx] = '\0';
        return true;
    }
    else {
        return false;
    }
}

It will be educational for you to implement fgets and getline yourself to understand how reading lines from a file actually works.

Upvotes: 5

Related Questions