2013-12-13 4 views
0

Я использую простые C и пытаюсь считывать данные из потока устройства (одна ленты)Linux, чтение ленточного устройства

size_t res=0; 
size_t total=0; 
char data[512]; 
FILE *f = fopen("/dev/st0","r"); 
if(!f) 
{ 
    perror ("Error:"); 
    printf("Value: %d\n", errno); 
    return; 
} 
while((res=fread(data,1, sizeof data,f))>0) 
{ 
    total+=res; 
} 
fclose(f); 
printf("read: %ld bytes\n", total); 

Это не работает таким образом, поэтому я предполагаю, что там должна быть каким-то конкретное способ сделать это.
Я не нашел в Google что-то полезное. Может быть, исходный код инструмента mt может помочь, но опять же он не читает/не записывает на ленту.

В результате
чтения: 0 байт

+0

Проверьте возвращаемое значение 'fopen'. – Kninnug

+0

Что именно должен делать этот код? – alk

+0

Работает ли он, если вы делаете 'cat/dev/st0> myfile'? – Devolus

ответ

3

Чтобы прочитать первые sizeof(data) байт (если таковые имеются) из устройства, указанного сделать так:

#define _POSIX_SOURCE /* for ferror */ 

#include <stdio.h> 

#define DEVICENAME "/dev/st0" 

int main(void) 
{ 
    int result = EXIT_SUCCESS; /* Be optimistic. */ 

    size_t total = 0; 
    char data[1024]; 

    FILE * f = fopen(DEVICENAME, "r"); 
    if (NULL == f) 
    { 
    fprintf(stderr, "Failed to open '%s'.\n", DEVICENAME); 
    result = EXIT_FAILURE; 
    } 
    else 
    { 
    total = fread(data, 1, sizeof(data), f); 
    if (ferror(f)) 
    { 
     fprintf(stderr, "Error reading from '%s'.\n", DEVICENAME); 
     result = EXIT_FAILURE; 
    } 

    fclose(f); 
    } 

    printf("Read %zd bytes from '%s'.\n", total, DEVICENAME); 

    return result; 
} 
+0

Нет, удалено. @Shahbaz – alk

+0

Мне было просто любопытно – Shahbaz

+0

Возможно, habbit при написании макросов для переноса коробки с дополнительными скобками. @Shahbaz – alk

Смежные вопросы