2016-09-27 2 views
0

gcc -Wall -W -g3で警告がコンパイルされない< inputfile.c> バイナリは何も表示せず、$ promptも表示されません。 gccバージョン4.9.2(Ubuntu 4.9.2-10ubuntu13)。私は、Keith HavilandによるUnix System Programmingの本から取り上げました。 read()呼び出しの例次のread()コールのコードが停止するのはなぜですか?

#include<stdio.h> 
    #include<stdlib.h> 
    #include<fcntl.h> 
    #include<unistd.h> 
    #define BUFSIZE 512 
    int main() 
    { 
    char buffer[BUFSIZE]; 
    int fd; 
    ssize_t nread; 
    long total = 0; 

    if((fd = open("fi.txt", O_RDONLY) == -1)){ 
     printf("error in opening file\n"); 
     exit(1); 
     } 
    while((nread = read(fd, buffer, BUFSIZE))>0) 
    total += nread; 
    printf("Total characters: %ld\n", total); 
    exit(0); 
} 

gdbの表示内容を理解できません。 fi.txtには、Helloという単語が1つだけ含まれています。

: 
. 
(gdb) s 
13  if((fd = open("fi.txt", O_RDONLY) == -1)){ 
(gdb) s 
open() at ../sysdeps/unix/syscall-template.S:81 
81 ../sysdeps/unix/syscall-template.S: No such file or directory. 
(gdb) print fd 
No symbol "fd" in current context. 
(gdb) s 
0xb7fdbbd0 in __kernel_vsyscall() 
(gdb) s 
Single stepping until exit from function __kernel_vsyscall, 
which has no line number information. 
main() at usp5.c:17 
17  while((nread = read(fd, buffer, BUFSIZE))>0) 
(gdb) print fd 
$1 = 0 
(gdb) s 
read() at ../sysdeps/unix/syscall-template.S:81 
81 ../sysdeps/unix/syscall-template.S: No such file or directory. 
(gdb) s 
0xb7fdbbd0 in __kernel_vsyscall() 
(gdb) s 
Single stepping until exit from function __kernel_vsyscall, 
which has no line number information. 
s 
main() at usp5.c:19 
19  printf("Total characters: %ld\n", total); 
(gdb) print total 
$2 = 0 
(gdb) print nread 
$3 = 2 
(gdb) s 
__printf (format=0x804863d "Total characters: %ld\n") at printf.c:28 
28 printf.c: No such file or directory. 
(gdb) print total 
No symbol "total" in current context. 
(gdb) s 
__x86.get_pc_thunk.bx() at ../sysdeps/i386/i686/multiarch/strcat.S:55 
55 ../sysdeps/i386/i686/multiarch/strcat.S: No such file or directory. 
(gdb) s 
__printf (format=0x804863d "Total characters: %ld\n") at printf.c:32 
32 printf.c: No such file or directory. 
(gdb) s 
33 in printf.c 
(gdb) list 
28 in printf.c 
(gdb) s 
_IO_vfprintf_internal (s=0xb7fb4e80 <_IO_2_1_stdout_>, format=0x804863d "Total characters: %ld\n", 
    ap=0xbfffed84 "") at vfprintf.c:222 
222 vfprintf.c: No such file or directory. 
(gdb) list 
...... 

同様のメッセージが表示されます。その後、あなたは正しい結果を得るでしょう

if((fd = open("fi.txt", O_RDONLY) == -1)){ 

if((fd = open("fi.txt", O_RDONLY)) == -1){ 

へ:

変更このラインコード:

+0

あなたはねあなたの 'open'条件に適切な式のparam setがありません。 [**正確な**この質問の重複](http://stackoverflow.com/questions/13169693/file-descriptors-open-returns-zero) – WhozCraig

答えて

1

は、私はあなただけの低レベルのミスを犯すと思います。

あなたのコードはfd = 0になり、0が標準入力になるので、progrmは常にあなたの入力を待ちます。ここ

+0

スパークバオありがとうございました。私は一晩中それと一緒に取り組んだ。私は非常にばかげた間違いを犯しました。ごめんなさい。 – Bishnu

3

あなたが紛失しているブラケット:FDになり

if((fd = open("fi.txt", O_RDONLY) == -1)){ 

ではなく、オープンの戻り値よりも、0に設定されています。したがって、実際にはfd 0(STDIN)から読み取っています。

それは次のようになります。

if((fd = open("fi.txt", O_RDONLY)) == -1){ 
+0

ありがとうございました。今は大丈夫です。一つの質問;ファイルfi.txtには5文字の文字列Helloが含まれていますが、数は6です。最後の\ nを数えますか? wc -cでも6が表示されます。 – Bishnu

+0

はい、ファイル内のすべての文字がカウントされます(\ nも)。 – harmic

+0

私は何回もwcを使いましたが、私はこの機能を認識していませんでした。私はwc -cが印字可能な文字だけを数えると思った。ありがとう。 – Bishnu

0

[コメントをあまりにも長い間:]

のベストプラクティスのデバッグを参照:一見単純なコードに失敗した場合は、隠された不必要に複雑ですが、基本的な構文を探し、それらを離れて取ります。これは書くことができ

if ((fd = open("fi.txt", O_RDONLY) == -1)) 
    { 
    perror("open() failed"); 
    ... 

fd = open("fi.txt", O_RDONLY); 
    if (fd == -1) 
    { 
    perror("open() failed"); 
    ... 
  • ファイルからの読み込み:

    ファイルを開く

    1. :あなたが表示され場合、2つのこのような構築物があります

      while ((nread = read(fd, buffer, BUFSIZE)) > 0) 
      

      書くこと:

      nread = read(fd, buffer, BUFSIZE); 
          while(nread > 0)  
          { 
          ... 
          nread = read(fd, buffer, BUFSIZE); 
          } 
          if (nread == -1) /* Add as much error checking as possible. */ 
          { 
          perror("read() failed)"); 
          } 
      

      以上read()にのみコールを使用して、しかしエラー処理を分離し、追加のifこの方法のコストのために:

      do 
      { 
          nread = read(fd, buffer, BUFSIZE); 
          if (nread == -1) /* Add as much error checking as possible. */ 
          { 
          perror("read() failed)"); 
          } 
          else 
          { 
          ... 
          } 
      } while (nread > 0); 
      
  • +0

    ありがとうございます。 ここで述べたすべての構成を試しました。 私はperror()を使用していたはずですが、間違った位置にかっこを置くと、それが何らかの助けになるかどうか疑いがあります。 この構文のperror()は機能しません。 'if((fd = open(" fi.txt "、O_RDONLY)== -1)) { perror(" open()failed "); ... '' #1の第2部分は大丈夫です。 – Bishnu

    +0

    あなたの#2の最初の部分 'nread = read(fd、buffer、BUFSIZE);という1行を追加しました。 **合計= nread; ** while(nread> 0) { ... 「 」それが動作します。私はあなたの#2の例をテストすることができますので、どうすればいいか教えてください。 – Bishnu

    +0

    申し訳ありません。 – Bishnu

    関連する問題