LINUX.ORG.RU

открыть файл в C


0

0

#include <stdio.h>
FILE * fp;
int main () {
  int l = 2895360;
  unsigned char *bbb;
  bbb = (char*)malloc(l*sizeof(char));
  fp = fopen ("1113721721.raw", "r");
  fscanf(fp,"%o",&bbb);
  int n=0;
  while (n < l) {
    printf ("%c\n",bbb[n++]);
  }
}



нифига не выводит... только перевод каретки...
то что файл содержит 2895360 байтов - точно известно. 
Хочется вывести unsigned char на STDIN, а оно не выводит...

thx!!!


anonymous

Ответ на: комментарий от UVV

вот что при компиляции:

[xxx@machine bm]$ gcc x.c
x.c: In function `main':
x.c:9: incompatible types in assignment
x.c:10: incompatible type for argument 1 of `fscanf'
[xxx@machine bm]$

:(

anonymous
()

2 UVV
> Может вот так FILE fp;
Не, лучше не надо :)

> fscanf(fp,"%o",&bbb);
%o - это еще что за ботва, я нашел, что у борладна это "Unsigned octal integer", а в man printf такого нет.
И вообще, нафига такие извраты, fread уже не катит?

phoenix ★★★★
()

Поправка - нашел в man 3 printf, unsigned octal (o), а Вы кажется пытаетесь это запихнуть в unsigned char :)

phoenix ★★★★
()
Ответ на: комментарий от phoenix

#include <stdio.h>

int main (int argc, char *argv[]) {
  long nchars = 0; /* Счетчик символов */
  FILE *fp = stdin; /* Если файл не задан, читается стандартный ввод */
  unsigned char buf [BUFSIZ]; /* Буфер для чтения файла */
  unsigned char *p1; /* Указатель на  обрабатываемую часть буфера */
  size_t nbytes = 0; /* Количество прочитанных, но не обработанных байт */
  if (argc > 2) {
    fprintf (stderr, "Использование: %s [файл]\n", argv [0]);
    return (2);
  }
  if (argc > 1 && (fp = fopen (argv [1], "r")) == NULL) {
    perror ("OPEN");
    fprintf (stderr, "%s: Не могу открыть файл %s\n", argv [0], argv[1]);
    return (2);
  }
  p1 = buf;
  for (;;) { /* Посимвольная обработка файла */
    if (nbytes == 0) { /* Нужно прочитать новую порцию */
     if (feof (fp)) {
/* При предыдущем чтении дошли до конца файла */
        break;
      }
      nbytes = fread (p1 = buf, (size_t) 1, sizeof (buf), fp);
      if (ferror (fp)){
        perror ("READ");
        fprintf (stderr, "%s: Ошибка чтения из файла %s:", argv [0], argc == 1 ? "стандартного ввода" : argv [1]);
        break;
      }
      if (nbytes == 0){
/* В файле не оставалось непрочитанных символов */
        break;
      }
      nchars += nbytes;
    }
    nbytes--;
  }
  if (argc > 1){
    fclose (fp);
  }
  printf ("символов: %ld\n",nchars);
  return (0);
}


Короче говоря, число символов в файле оно считает, а как сделать 
так, чтобы оно еще и выводило эти символы в порядке записи - я не шарю... :(

anonymous
()
Ответ на: комментарий от anonymous

WoW, а нафига? Число символов == размер файла, узнать можно хоть из fstat, хоть из fseek(f, 0, SEEK_END)/ftell().

>так, чтобы оно еще и выводило эти символы в порядке записи - я не шарю... :(
Что значит в порядке записи, я не понял смысла это фразы

phoenix ★★★★
()
Ответ на: комментарий от phoenix

ну у меня просто есть файл, в котором есть символы unsigned char, в фиксированном количестве, мне надо их засунуть в массив по типу symbols[i]...

anonymous
()
Ответ на: комментарий от anonymous

> символы unsigned char Это больше похоже на тавтологию - в файле кроме байтов вообще больше ничего нету, так что у Вас файл, полный unsigned char-ов :)

phoenix ★★★★
()
Ответ на: комментарий от phoenix

как мне их на печать то вывести???????????????????? на перле минута делать, но я не умею на сях... :(

anonymous
()
Ответ на: комментарий от phoenix

можно вот так:

int main() { char buf[1000]; int len, fd; if ( (fd = open(filename, O_RDONLY)) < 0 ) exit(1); while ( (len = read(fd, buf, sizeof(buf))) >= 0) write(1, buf, len); return 0; }

no1sm ★★
()
Ответ на: комментарий от phoenix

написало, но что то не то... :(

#include <stdio.h>

int main (int argc, char *argv[]) {
  long nchars = 0; /* Счетчик символов */
  FILE *fp = stdin; /* Если файл не задан, читается стандартный ввод */
  unsigned char buf [BUFSIZ]; /* Буфер для чтения файла */
  unsigned char *p1; /* Указатель на  обрабатываемую часть буфера */
  size_t nbytes = 0; /* Количество прочитанных, но не обработанных байт */
  if (argc > 2) {
    fprintf (stderr, "Использование: %s [файл]\n", argv [0]);
    return (2);
  }
  if (argc > 1 && (fp = fopen (argv [1], "r")) == NULL) {
    perror ("OPEN");
    fprintf (stderr, "%s: Не могу открыть файл %s\n", argv [0], argv[1]);
    return (2);
  }
  p1 = buf;
  if (argc > 1){
    fclose (fp);
  }
  int i;
  for (i = 0; i < 2895360; ++i)
    if (isprint(buf[i]))
    fprintf(stdout, "%c", buf[i]);
  printf ("символов: %ld\n",nchars);
  return (0);
}

File x.c not changed so no update needed.
[xxx@server bm]$ gcc x.c

И вот что выводит:

[xxx@server bm]$ ./a.out
@]@xlc@@BH2A@A@BBBBB@B0BHVBe@:]@@h@Xf@/pf@AXf@]@@=@a@\ybB5BA@5BAY@[Z@3]@@h7@B\]@
aT@h@@S@$BD^@]@Z@@(N@$B@D7ybB>$Bpf@Z@]@F@AXf@_@.@@xa@A_@Xf@ELFXB4D-4
 (?>44B4BPPBPBBBBB,hR-B-B44B4B  ,B,B4 
PtdddBdBGNU;&P{E@]@H@@$Bh@k@]@pf@@<B@|x 
BB3Bpf@i@]@a@@x@@@(Ha@j@i@]@a@I@xs@I@{{`@`Ha@(]@\Z@0Bpf@]@{{\Z@Z@@]@Z@p@a@j@$B]@
e@`]@XD]@AZ@l!BZ@l!B]@ @@@@7@Z@@pf@@^@@@@44Z@Z@Z@x0B7@D"<@`4Q@H@,@p@\@]@9@]@@Z@a@_@P,@H,@J,@Z@D
;\(k@
 0@p Y@_@@h3\@Q~@1@]@_@_@4-R4Linuxobserv.inetcomm.ru@<B<B 
BB3Bpf@i@]@h@LBL@LBPjB@A(b@k@]@_@@<B04 
BB3Bpf@i@]@a@@wpHa@@i@(none)@]@<p@h@w_@Bpf@L.BjLBPjB-B`Tp@PB@]@R_@@a@@i@VB23B
-B-B@B-B
 Y@(WBT\]@%T$T@L`h$7Xe(E"5Ez d4 
@[i686./a.outMANPATH=:/usr/local/FADPS/manHOSTNAME=observ.inetcomm.ruTERM=xtermS
HELL=/bin/bashHISTSIZE=1000SSH_CLIENT=212.152.36.164
 4169 
22QTDIR=/usr/lib/qt-3.1FGRRC=/usr/local/FADPS/lib/fgrrcSSH_TTY=/dev/pts/1SPGRC=/
usr/local/FADPS/lib/spgrcUSER=vilfredLS_COLORS=no=00:fi=00:di=00;34:ln=00;36:pi=
40;33:so=00;35:bd=40;33;01:cd=40;33;01:or=01;05;37;41:mi=01;05;37;41:ex=00;32:*.
cmd=00;32:*.exe=00;32:*.coSegmentation
 fault
[xxx@server bm]$
[xxx@server bm]$


но это явно не 2895360 символов... :(

anonymous
()
Ответ на: комментарий от anonymous

лано, вобщем я сей явно не знаю. задача такая, есть файл с именем 
123456.raw, содержит x штук байтов от 0 до 255(байты это числа в 
16тиричном виде) в виде unsigned char, надо напечатать эти байты в виде от 0 до 255.

т.е. на перле это былоб так:

open f,">123456.raw"; 
while(<F>){
  print unpack "C" => $_
  print "\n";
} 
close F;

anonymous
()
Ответ на: комментарий от anonymous

походу дела вот это:

#include <stdio.h>

FILE * fp;
int main () {
  long int l = 2895360;
  unsigned char bbb[l];
  fp = fopen ("1113721721.raw", "r");
  int n=0;
  while (n < l) {
    bbb[n] = getc (fp);
    fprintf (stderr,"%d %d \n",bbb[n],n);
    n++;
  }
}

anonymous
()
Ответ на: комментарий от anonymous

> ну у меня просто есть файл, в котором есть символы unsigned char, в фиксированном количестве, мне надо их засунуть в массив по типу symbols[i]...

man 2 open, man 2 read, man 2 mmap

ananas ★★★★★
()
Ответ на: комментарий от anonymous

man fread

unsigned char* buffer = malloc(size);
.....
/* читаем весь файл одним вызовом */
if(fread(buffer,size,1,fp)!=1)
   fprintf(stderr,"е-мое! :)\n");

kosmonavt
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.