user2039831
user2039831

Reputation:

Scan whole line from file in C Programming

I was writing a program to input multiple lines from a file. the problem is i don't know the length of the lines, so i cant use fgets cause i need to give the size of the buffer and cant use fscanf cause it stops at a space token I saw a solution where he recommended using malloc and realloc for each character taken as input but i think there's an easier way and then i found someone suggesting using

fscanf(file,"%[^\n]",line);

Does anyone have a better solution or can someone explain how the above works?(i haven't tested it)

i use GCC Compiler, if that's needed

Upvotes: 4

Views: 12647

Answers (4)

Gangadhar
Gangadhar

Reputation: 10516

A simple format specifier for scanf or fscanf follows this prototype

%specifier 

specifiers

As we know d is format specifier for integers Like this

[characters] is Scanset Any number of the characters specified between the brackets. A dash (-) that is not the first character may produce non-portable behavior in some library implementations.

[^characters] is Negated scanset Any number of characters none of them specified as characters between the brackets.


fscanf(file,"%[^\n]",line);  

Read any characters till occurance of any charcter in Negated scanset in this case newline character


As others suggested you can use getline() or fgets() and see example

Upvotes: 1

user529758
user529758

Reputation:

and then i found someone suggesting using fscanf(file,"%[^\n]",line);

That's practically an unsafe version of fgets(line, sizeof line, file);. Don't do that.

If you don't know the file size, you have two options.

  1. There's a LINE_MAX macro defined somewhere in the C library (AFAIK it's POSIX-only, but some implementations may have equivalents). It's a fair assumption that lines don't exceed that length.

  2. You can go the "read and realloc" way, but you don't have to realloc() for every character. A conventional solution to this problem is to exponentially expand the buffer size, i. e. always double the allocated memory when it's exhausted.

Upvotes: 1

Ben
Ben

Reputation: 693

You can use getline(3). It allocates memory on your behalf, which you should free when you are finished reading lines.

Upvotes: 2

CS Pei
CS Pei

Reputation: 11047

The line fscanf(file,"%[^\n]",line); means that it will read anything other than \n into line. This should work in Linux and Windows, I think. But may not work in OS X format which use \r to end a line.

Upvotes: 0

Related Questions