2012-09-03 29 views
26

Tôi đang cố gắng đọc một dòng tại một thời điểm, có độ dài tùy ý, từ stdin tại dòng lệnh. Tôi không chắc liệu tôi có thể bao gồm GNU readline hay không và muốn sử dụng chức năng thư viện.Làm thế nào để đọc một dòng từ stdin, chặn cho đến khi dòng mới được tìm thấy?

Tài liệu tôi đã đọc gợi ý rằng getline phải hoạt động, nhưng trong thử nghiệm của tôi, nó không chặn. Chương trình mẫu của tôi:

#include <stdio.h> 
int main() 
{ 
    char *line = NULL; 
    if (getline(&line, NULL, stdin) == -1) { 
     printf("No line\n"); 
    } else { 
     printf("%s\n", line); 
    } 
    return 0; 
} 

sản xuất No line, làm cho nó không phù hợp để chấp nhận đầu vào của người dùng.

Làm cách nào để thực hiện việc này? Tôi biết nó không đáng kể, nhưng tôi đã không thể hình dung ra được.

+1

'getline()' * does * block (chỉ được thử nghiệm trên 'stdin'). Bạn có thể gửi mã mẫu không? – LSerni

+1

Bản sao có thể có của [Cách đọc một dòng từ bảng điều khiển trong C] (http://stackoverflow.com/questions/314401/how-to-read-a-line-from-the-console-in-c) –

Trả lời

44

Hãy thử bản vá này

char *line = NULL; 
+size_t size; 
+if (getline(&line, &size, stdin) == -1) { 
-if (getline(&line, 0, stdin) == -1) { 
    printf("No line\n"); 
} else { 
+3

Điều này giải quyết nó. Và tôi nhận ra sai lầm của mình; Tôi đã đọc sai tài liệu và nghĩ 'n' là' size_t' thay vì 'size_t *'. Cảm ơn bạn! – Taymon

+32

Tôi thực sự thích kiểu điều khiển phiên bản của mã trong câu trả lời này. – whirlwin

+2

Có một lời giải thích cho việc này hoạt động không? Tôi giả định kể từ khi tài liệu nói rằng kích thước được bỏ qua khi dòng là một con trỏ null, mà tôi cũng có thể vượt qua một con trỏ null để kích thước. –

4

tôi đã có thể để tái tạo một "nonblocking" hành vi trên getline:

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

int main() 
{ 
     char *buffer; 
     size_t n = 1024; 
     buffer = malloc(n); 
     return getline(&buffer, &n, stdin); 
} 

getline(&buffer... khối. Nếu tôi gán NULL cho buffer, một lần nữa nó chặn (như được quảng cáo) và lưu trữ dòng trong bộ đệm mới được phân bổ.

Nhưng nếu tôi viết

getline(NULL, &n, stdin); 

sau đó getline thất bại, và dường như không chặn. Có lẽ cũng là n hoặc con trỏ tệp không hợp lệ có thể gây ra cùng một hành vi. Đây có phải là vấn đề không?

Các vấn đề liên quan