08-09-2011
Never use scanf if you can help it. It will stop at the first character it considers invalid and leave it to be read next time -- so next time you scanf to read a line it instantly fails.
If you want to input individual lines, scanf is overkill anyway -- use the purpose-built line reading function, fgets(buffer, size, file); It adds a NULL to the end like most string functions. It also leaves in the newline, just to warn you.
And if you want to use scanf to extract parts of a line, you can do sscanf(buffer, "command string", &var1, &var2, ...) to scan the string you just got with fgets, no worries about scanf leaving junk in the buffer that way.
There's also a printf function which writes to a buffer, sprintf(buffer, "commandstring", arg, arg, ...); which you can use to conveniently format data before feeding it into write() if you want.
Your readline function makes an assumption, namely, that the stream contains NULLs. Since you haven't posted most of your code, I have no idea at all if these assumptions are true everywhere. But I'm guessing they're not.
write() is not a stdio function, it's a raw system call -- it doesn't add anything for you, it sends bytes as given without question. So write(fd, "abcd", strlen("abcd")) sends four bytes with no NULL terminator. strlen()+1 will send the NULL assuming there is one.
You do have the right idea in using a terminator, since a write on one end might not all arrive in one read on the other.
Last edited by Corona688; 08-09-2011 at 04:41 PM..
10 More Discussions You Might Find Interesting
1. Shell Programming and Scripting
I'm writing a bash shell script to backup several mysql databases. This script will run on a daily basis and send a copy to a remote FTP repository. The filenames are in the format DATE.backup.sql. How do I store the DATE variable so I can delete/move/etc the file on the FTP server the next time... (4 Replies)
Discussion started by: hoover90
4 Replies
2. Shell Programming and Scripting
how would i go about storing this command in a variable
echo "$LINE" | awk -F"|" '{print $1"|"$2"|"$3"}'
i have tried FOO = ${command up there} but receive the error FOO: not found
aswell as a couple of other attempt but no luck (2 Replies)
Discussion started by: nookie
2 Replies
3. Shell Programming and Scripting
Hi Everyone,
I have a code which requires to be stored in different variables and I am achiving it like this.
HOST=`echo $RMP | cut -f2 -d:`
NAME=`echo $RMP | cut -f3 -d:`
DIR=`echo $RMP | cut -f4 -d:`
TYPE=`echo $RMP | cut -f5 -d:`
Is there any other way of storing value... (2 Replies)
Discussion started by: gehlnar
2 Replies
4. Shell Programming and Scripting
Hi all,
I m new to this forum.
I ma facing onei issue.
I have something like this:
length= wc -l < b2| awk '{print $1}'
where b2 is filename having detauls like:
cat b2
abc1
abc4
xyc3
sbdghf4
but when I do echo "$length" it displays nothing
Also I am using awk to overcome... (4 Replies)
Discussion started by: student2009
4 Replies
5. Shell Programming and Scripting
Hi,
I need to figure out a way to to capture the contents of a field that is separated by a pipe sign.
Example Data:
-100F| some other description
-10C| some description
| some description
As you can see, the length of the field on the left of the pipe can be any length and... (3 Replies)
Discussion started by: doza22
3 Replies
6. Shell Programming and Scripting
#bash
curVer=`cat /var/sadm/clsversion | cut -f 2 -d "_"`
echo "CurVer:$curVer"
ls |grep -v tar| grep -v sh| grep -v log|cut -f 1 -d "_" | sort -u >tmp1
for line in $(cat tmp1)
do
ver=`echo $line_$curVer`
ls $line* |sort >tmp2
grep -n ${ver} tmp2 >/dev/null
... (2 Replies)
Discussion started by: rajamohan
2 Replies
7. Shell Programming and Scripting
Hi,
I have a ftp script there I want to store the o/p of the below command:
sftp -b <batch file> user@password
cat <batch file>
get /remote/file/path/remote_file_name.csv*.gz /local/path
Now the problem is that when I fire this command. Then it gives o/p as:
File... (7 Replies)
Discussion started by: dips_ag
7 Replies
8. UNIX for Dummies Questions & Answers
Hi,
ps -ef|awk '{print $2}'
i want to store the result of the above command in a variable.
I never worked with arrays in shell scripting.
i tried the below code:
set a=`ps -ef|awk '{print $2}'`
But echo $a returns null.
I want to store the content in a variable and retrieve it... (2 Replies)
Discussion started by: pandeesh
2 Replies
9. Shell Programming and Scripting
My script below seems to be choking because I need the the output of the find command to be stored as a variable that can then be called by used lower in the script.
#!/bin/bash
cd "/resumes_to_be_completed"
var1=find . -mmin -1 -type f \( -name "*.doc" -o -name "*.docx" \)... (1 Reply)
Discussion started by: binary-ninja
1 Replies
10. UNIX for Advanced & Expert Users
I have a below syntax its working fine...
var12=$(ps -ef | grep apache | awk '{print $2,$4}')
Im getting expected output as below:
printf "%b\n" "${VAR12}"
dell 123
dell 456
dell 457
Now I wrote a while loop.. the output of VAR12 should be passed as input parameters to while loop and results... (5 Replies)
Discussion started by: sam@sam
5 Replies
GETS(3) Linux Programmer's Manual GETS(3)
NAME
fgetc, fgets, getc, getchar, gets, ungetc - input of characters and strings
SYNOPSIS
#include <stdio.h>
int fgetc(FILE *stream);
char *fgets(char *s, int size, FILE *stream);
int getc(FILE *stream);
int getchar(void);
char *gets(char *s);
int ungetc(int c, FILE *stream);
DESCRIPTION
fgetc() reads the next character from stream and returns it as an unsigned char cast to an int, or EOF on end of file or error.
getc() is equivalent to fgetc() except that it may be implemented as a macro which evaluates stream more than once.
getchar() is equivalent to getc(stdin).
gets() reads a line from stdin into the buffer pointed to by s until either a terminating newline or EOF, which it replaces with '