Michael, Your first post was clear. Therefore the error remains. When you close the file you lose the fd. f is nil. For example,
package main import ( "bufio" "flag" "fmt" "log" "os" ) func cli() string { flag.Parse() return flag.Arg(0) } func openFile(s string, file *os.File) { file, err := os.Open(s) if err != nil { log.Fatal(err) } defer file.Close() } func main() { fname := cli() var f *os.File openFile(fname, f) fmt.Println(f) ireader := bufio.NewReader(f) scanner := bufio.NewScanner(ireader) lcounter := 0 for scanner.Scan() { lcounter++ } fmt.Printf("# lines read : %d\n", lcounter) } Output: <nil> # lines read : 0 Peter On Wednesday, June 21, 2017 at 4:58:58 PM UTC, Michael Dwyer wrote: > > Peter, > > Thank you for your input regarding my question. > > In an effort to clear up any confusion or ambiguity regarding the problem > I am running into, > I will post the code for what is working and the code that is not working. > > The following block of code works, a valid file is passed to the > executable, the file is read > and the results of how many lines were read are emitted to stdout: > > package main > > import ( > "flag" > "bufio" > "fmt" > "log" > "os" > ) > > func cli() string { > flag.Parse() > return flag.Arg(0) > } > > func openFile(s string, file *os.File) { > file, err := os.Open(s) > if err != nil { > log.Fatal(err) > } > defer file.Close() > } > > func main() { > fname := cli() > f, err := os.Open(fname) > if err != nil { > log.Fatal(err) > } > defer f.Close() > ireader := bufio.NewReader(f) > scanner := bufio.NewScanner(ireader) > lcounter := 0 > for scanner.Scan() { > lcounter++ > } > fmt.Printf("# lines read : %d\n", lcounter) > } > > The following is an attempt to refactor the code by moving one section of > code, > specifically the code that opens a file handle returning a file descriptor > to variable named "f". > The file file descriptor "f" will then be used to create a buffered Reader > & Scanner. It is this code > that is not working, for which I seek assistance to understand why it is > not working, and for a solution > that adheres to what I was trying to do in the function named openFile(), > which is pass two parameters > to openFile(), the first, a string containing the path to be opened, the > second parameter will be a pointer > to os.File. > > What I am attempting to do here is to pass the path to be opened, while at > the same time pass a pointer > that will be used to return the file descriptor. The code that is not > working follows: > > package main > > import ( > "flag" > "bufio" > "fmt" > "log" > "os" > ) > > func cli() string { > flag.Parse() > return flag.Arg(0) > } > > func openFile(s string, file *os.File) { > file, err := os.Open(s) > if err != nil { > log.Fatal(err) > } > defer file.Close() > } > > func main() { > fname := cli() > var f *os.File > openFile(fname, f) > ireader := bufio.NewReader(f) > scanner := bufio.NewScanner(ireader) > lcounter := 0 > for scanner.Scan() { > lcounter++ > } > fmt.Printf("# lines read : %d\n", lcounter) > } > > I hope that I have been able to remove the ambiguity from the code, > and the intent of what it is I am trying to accomplish is clear. > > Again, thanks in advance to anyone that can help me resolve this issue. > > > THANX(MKD). > > -- You received this message because you are subscribed to the Google Groups "golang-nuts" group. To unsubscribe from this group and stop receiving emails from it, send an email to golang-nuts+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.