Sponsored Content
Top Forums Programming Fscanf to get number and replace. Post 302909710 by Corona688 on Friday 18th of July 2014 11:48:03 AM
Old 07-18-2014
This is having "some problem" -- which some problem? Be specific.

Files don't work that way. You can't delete characters in the middle like a text editor to make it shrink. What pretty much everything does is create a new file, and replace the contents of the old one with it.

Don't use fscanf. It's got "features" most people would consider bugs. Use fgets and sscanf to avoid its buffering problems.

Code:
char buf[4096];
FILE *fpold=fopen("filename", "r");
FILE *fpnew=fopen("newfile", "w+");

while(fgets(buf, 4096, fp) != NULL) // Read all lines from filename one-by-one
{
        int val;
        char *last=(buf+strlen(buf))-1; // Point to last character

        while(isspace(*last)) last--; // Loop backwards across the ending newline
        while(isdigit(*last)) last--; // Loop backwards across digits
        // 'last' now points to the first non-digit before the number.
        last[0]='\0'; // Change it into a NULL.
        last++; // Point to the character after, i.e. the number itself.

        // 'buf' now points to the string and only the string,
        // and 'last' points to the number and only the number.

        sscanf("%d", &val); // convert string into integer

        ////////
        // To alter the contents of the file, alter 'buf' or 'val' here.
        ////////

        fprintf(fpnew, "%s %d\n", buf, val); // Write all contents back into 'fpnew'.
}

fclose(fpold);

// Now, if you really want to, you can re-open fpold as write, read lines one-by-one from fpnew, and write them back into fpold.
rewind(fpnew);
...

 

10 More Discussions You Might Find Interesting

1. Programming

fscanf()

thanks to everyone for your earlier replies, but i have yet another problem with file i/o. i'm trying to read multiple lines with the same file, and have been using the following code to take in the first two lines from a file... fscanf(fileptr, "%d %d %d %d %d %d\n", &n1, &n2, &n3, &n4, &n5,... (1 Reply)
Discussion started by: j_t_kim
1 Replies

2. Programming

fscanf()

I keep trying to use fscanf() and for some reason I can't get the syntax down and always get seg faults. I'm on a SunOS 5.5.1, and my current code looks like this: int n1, n2, n3, n4, n5, n6; /* open config file */ if (fileptr = fopen(filename,"r") == NULL) { printf("couldn't open... (3 Replies)
Discussion started by: j_t_kim
3 Replies

3. Programming

fscanf

Hi, Can any one tell me what "%hx" as control parameter mean in fscanf. Thanks, abey (4 Replies)
Discussion started by: abey
4 Replies

4. Programming

read a file wich fscanf() in a function

I use fopen, fscanf, fclose to read a file. It can work well. since many files should be read, a function is created with the same code. But in the function, fscanf can not work well. for example, the first line of the the file is: > filename but the fscanf will give: 207/23/eee/34 it appears... (2 Replies)
Discussion started by: cdbug
2 Replies

5. Programming

C, using fscanf

hey guys, I'm working on a term project for a c/unix class. The basis of the program is that it will calculate the weight/balance of a plane. I'm hoping to have an input file as such: " Pilot weight: Passenger weight: baggage wieght: etc " and the idea is that I'm trying to use... (2 Replies)
Discussion started by: jlangholzj
2 Replies

6. Programming

fscanf: read words from file

Hi I have a file like that: 1 2 3 4 5 6 7 8 and I want print on stdout: 1 3 8 in other words i want choose what print out. I was thinking to use fscanf as: fscanf(file_in,"%d %d %d",&a, &b,&c); but in this way i get: 1 2 3 Is there a solution using fscanf to obtain my... (2 Replies)
Discussion started by: Dedalus
2 Replies

7. Shell Programming and Scripting

awk - replace number of string length from search and replace for a serialized array

Hello, I really would appreciate some help with a bash script for some string manipulation on an SQL dump: I'd like to be able to rename "sites/WHATEVER/files" to "sites/SOMETHINGELSE/files" within the sql dump. This is quite easy with sed: sed -e... (1 Reply)
Discussion started by: otrotipo
1 Replies

8. UNIX for Dummies Questions & Answers

how fscanf every two data

hi there... i have a question regarding the fscanf function... let's say i have a data: 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 how do i read only the first COLUMN, or the second COLUMN or the third COLUMN or etc....?????? thanks (1 Reply)
Discussion started by: theunknown
1 Replies

9. UNIX for Dummies Questions & Answers

DB2: Replace Number Value

Hi In the below query userreg.status returns a value of 1 (Active) or -1 (Non Active). Ideally, I would like to replace this automatically on the export so instead of getting 1 or -1 I get Active / Non Active. Any help, as usual, would be greatly apprecited. (1 Reply)
Discussion started by: theref
1 Replies

10. Shell Programming and Scripting

Replace first number of each line in a file with another number

Hi, I have a set of files in a directory that I have to read and replace the first occurrence of a number with another dummy number. This is what I have so far but it does not seem to work. The files have lot of other data in each row and each data element is separated by ,@, for file in... (13 Replies)
Discussion started by: scorpioraghu
13 Replies
SETBUF(3S)																SETBUF(3S)

NAME
setbuf, setbuffer, setlinebuf - assign buffering to a stream SYNOPSIS
#include <stdio.h> setbuf(stream, buf) FILE *stream; char *buf; setbuffer(stream, buf, size) FILE *stream; char *buf; int size; setlinebuf(stream) FILE *stream; DESCRIPTION
The three types of buffering available are unbuffered, block buffered, and line buffered. When an output stream is unbuffered, information appears on the destination file or terminal as soon as written; when it is block buffered many characters are saved up and written as a block; when it is line buffered characters are saved up until a newline is encountered or input is read from stdin. Fflush (see fclose(3S)) may be used to force the block out early. Normally all files are block buffered. A buffer is obtained from malloc(3) upon the first getc or putc(3S) on the file. If the standard stream stdout refers to a terminal it is line buffered. The standard stream stderr is always unbuffered. Setbuf is used after a stream has been opened but before it is read or written. The character array buf is used instead of an automati- cally allocated buffer. If buf is the constant pointer NULL, input/output will be completely unbuffered. A manifest constant BUFSIZ tells how big an array is needed: char buf[BUFSIZ]; Setbuffer, an alternate form of setbuf, is used after a stream has been opened but before it is read or written. The character array buf whose size is determined by the size argument is used instead of an automatically allocated buffer. If buf is the constant pointer NULL, input/output will be completely unbuffered. Setlinebuf is used to change stdout or stderr from block buffered or unbuffered to line buffered. Unlike setbuf and setbuffer it can be used at any time that the file descriptor is active. A file can be changed from unbuffered or line buffered to block buffered by using freopen (see fopen(3S)). A file can be changed from block buffered or line buffered to unbuffered by using freopen followed by setbuf with a buffer argument of NULL. SEE ALSO
fopen(3S), getc(3S), putc(3S), malloc(3), fclose(3S), puts(3S), printf(3S), fread(3S) BUGS
The standard error stream should be line buffered by default. The setbuffer and setlinebuf functions are not portable to non-4.2BSD versions of UNIX. On 4.2BSD and 4.3BSD systems, setbuf always uses a suboptimal buffer size and should be avoided. Setbuffer is not usually needed as the default file I/O buffer sizes are optimal. 4th Berkeley Distribution May 12, 1986 SETBUF(3S)
All times are GMT -4. The time now is 08:03 AM.
Unix & Linux Forums Content Copyright 1993-2022. All Rights Reserved.
Privacy Policy