Take the 2-minute tour ×

I need to read an input file like :

19 20 41 23
41 52 43
90 91 941

51 61

each odd line is an integer each even line is unknown number of integers

it is very easy in C++

while( cin >> k ){

Im not so used to C language so I couldnt make it in C. any ways to do it?

share|improve this question
Do you have to pay attention to lines, or is this just a series of integers coming in? In your example, it looks like the odd lines are sequence numbers and the even lines represent something else. –  David Thornley Feb 3 '10 at 22:09
david I need to pay attention to the lines. that is why I couldnt do it. I need to stop getting new values at the end of each even line. Because I have a struct with attributes id and list. each odd line is an id and each even line is a list. I want to fill a struct with 2 lines of data and move to another struct and fill it with another 2 lines of data etc... –  huhuhuuu Feb 3 '10 at 22:14
Read in an entire line at a time and then just parse it as a string –  Joe Philllips Feb 3 '10 at 22:39
add comment

5 Answers

up vote 5 down vote accepted

The way I would do it is to break it down into two operations: read a line, then read the integers in that line. Here is a lazy implementation using the standard C library:

char line[1024], *p, *e;
long v;
while (fgets(line, sizeof(line), stdin)) {
    p = line;
    for (p = line; ; p = e) {
        v = strtol(p, &e, 10);
        if (p == e)
        // process v here
share|improve this answer
Thanks a lot. I'll try it now. But what if I cannot assume a fixed maximum line length? –  huhuhuuu Feb 3 '10 at 23:24
add comment

Running your input file through:

#include <stdio.h>

int main() {
        int k;
        while (scanf("%d", &k) == 1) {
                printf("read number: %d\n", k);
        return 0;

Results in:

read number: 1
read number: 19
read number: 20
read number: 41
read number: 23
read number: 2
read number: 41
read number: 52
read number: 43
read number: 3
read number: 90
read number: 91
read number: 941
read number: 4
read number: 512
read number: 5
read number: 6
read number: 51
read number: 61

This is the C analog of the code you reference in your original question.

share|improve this answer
add comment

I would break the program in different tasks.

The first step is to be able to read a pair of lines, the first line which tells you the number of numbers to read, and then the second line to read the actual numbers. For this, a function called something like read_set might be useful. It should be able to return the numbers read, and signal end of file as well as errors. For this, we can define a data structure such as:

struct numbers {
    long *data; /* or choose a type depending upon your needs */
    size_t len;

and then we can declare our function with the prototype:

int read_set(FILE *fp, struct numbers *num);

The function will allocate memory for num->data, and set num->len to the correct value. It returns 0 for success, and a set of error conditions otherwise. We might get fancy and use an enum for return statuses later. For now, let's say that 0 = success, 1 = end of file, and everything else is an error.

The caller then calls read_set() in a loop:

struct numbers numbers;
int status;
while ((status = read_set(fp, &numbers)) == 0) {
    /* process numbers->data, and then free it */
if (status == 1) {
    /* hit end of file, everything is OK */
} else {
    /* handle error */

For implementing read_set(): it has to read two lines. There are many implementations of reading a full line in C, so you can use any of them, and read a line first, then sscanf()/strtoul() it for one number (check its return value!). Once you have the number of numbers, n, you can read the next line in memory, and do:

num->data = malloc(n * sizeof *num->data);
num->len = n;

You can then repeatedly call sscanf() or strtol() to store numbers in num->data. You should put in checks to make sure exactly n numbers are on that line.

Note that you can write read_set() in other ways too: read a line character by character, and parse the numbers as you read them. This has the advantage of going over the data only once, and not needing a big buffer to store the whole input line in memory, but the disadvantage is doing low-level stuff yourself and reading data character-by-character may be slow.

share|improve this answer
add comment

have a look at getc(3) or scanf(3)

share|improve this answer
add comment

I would do one of:

  • fgetc() to read individual characters and parse them yourself (accumulate digits until you hit whitespace and you have an integer to convert with atoi(); if the whitespace is a newline, then it terminates a list of integers)

  • fgets() to read a line at a time, and then parse the string (again, look for whitespace separating the values) that it returns.

share|improve this answer
add comment

Your Answer


