1

ファイルから読み取ってターミナルに出力する簡単なプログラムを書こうとしています。しかし、ファイルを開いた後、プログラムはハングします。読み部分を外せばうまくいきます。何が悪いのかわかりません。誰かが助けることができますか?お願いします!

#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>

int main(void)
{
  int fd,bytes;
  char buffer[10];
  char path[ ] = "file";

  if(fd = open(path, O_RDONLY) < 0) {
    perror("open");
    exit(EXIT_FAILURE);

  } else {
    printf("opened %s\n", path);
  }

  do {
    bytes = read(fd,buffer,10);
    printf("%d", bytes);
  } while( bytes > 0);

  if(close(fd) < 0) {
    perror("close");exit(EXIT_FAILURE);
  } else{
    printf("closed %s\n", path);
  }
  exit(EXIT_SUCCESS);
}
4

2 に答える 2

4
if(fd = open(path, O_RDONLY) < 0) {

これは次のように解析されます。

if(fd = (open(path, O_RDONLY) < 0)) {

に 0 または 1 を割り当てますfd。余分な括弧のセットが必要です:

if((fd = open(path, O_RDONLY)) < 0) {

または、2 行で記述してください。

fd = open(...);
if (fd < 0) {
于 2012-11-15T19:59:50.533 に答える
2

したがって、最初にマットが説明したように、「ファイル」が存在する場合、プログラムは fd に 0 を割り当てます。stdin からの連続読み取りの読み取り。これは「ぶら下がっている」と解釈できますが、実際には、プログラムは stdin から読み取るだけで、末尾に \n がないため、printf は表示されません。に変更すると

do {
  bytes = read(fd,buffer,10);
  printf("%d", bytes);
  fflush (stdout);
} while( bytes > 0);

その後、何が起こるかがわかります... 乾杯。

于 2012-11-15T20:16:15.067 に答える