如何打印fread()?

时间:2014-08-06 12:24:23

标签: c printf fread

我发誓,我在问这里之前已经研究了很多,但找不到任何有用的东西。

我有一个扩展名为.pcm的文件,其中包含我想稍后使用某些操作的数据(数字)。现在,只是为了查看数据是什么,我只想打印其内容。它可能应该被读作类型short,因为我以前在MatLab中使用过相同的文件。

#include <stdio.h>

int main()
{
    FILE *fp;
    short input[1000];
    int i;
    fp=fopen("Sweep_10_310.pcm", "rb"); 
    if (!fp) { 
        printf("Could not open file!\n"); 
        return 1; 
    }

    for (i = 0; i < 100; i++)
    {
        printf("%d",fread(input,sizeof(short),1,fp));
    }
    fclose(fp);
    return 0;
}

控制台仅打印零。

如果我为不同的文本文件更改文件(只是为了测试代码)并更改所有&#34;短&#34; to&#34; char&#34;,我得到了相同的结果。哪个是传播文件的理想方式?

**编辑: 最后,我的文件实际上是空的:( 无论如何,这里的答案有用,并且学到了很多东西

6 个答案:

答案 0 :(得分:2)

fread()将返回读取的项目数而不是正在读取的实际数据。因此,如果printf()返回fread()的值,则不会获得实际的项目读取。相反,你必须printf()你的“输入”,fread正在复制其读取内容的缓冲区。如果出现错误,请使用ferror()确定出现了什么问题。

答案 1 :(得分:2)

这是一种方法:

sizeof *input给出单个数组元素中的字节数;它相当于sizeof (short)

short input[NUM_ITEMS] = {0}; 
...
int itemsRead = fread( input, sizeof *input, NUM_ITEMS, fp );
for ( int i = 0; i < itemsRead; i++ )
{
  /**
   * use %hd format specifier for short values
   */
  printf( "%hd ", input[i] );
}
putchar( '\n' );

如果itemsRead为0,那么您要么点击EOF,要么输入时出错:

if ( !itemsRead )
{
  if ( feof( fp ) )
    fprintf( stderr, "hit end-of-file\n" );
  else
    fprintf( stderr, "error during read\n" );
}

答案 2 :(得分:0)

fread返回读取的项目数或零。您还必须使用feof,因为fread无法区分EOF和错误。

这对你来说更好,一字又一字地读:

int c;
FILE *file;
file = fopen("Sweep_10_310.txt", "r");
if (file) {
    while ((c = getc(file)) != EOF)
        putchar(c);
    fclose(file);
}

答案 3 :(得分:0)

试试这个:

int j;

...

j = fread(input, sizeof(short), 100, fp); 

for (i = 0; i < j; i++)
{
   printf(" %d", input[i]);
}

答案 4 :(得分:0)

使用fread()后,请注意其返回值并使用它来确定读取的数量。使用input的大小来确定一次尝试阅读的数量。

#define N (1000)
short input[N];
...
size_t num_of_elements_read;
while ((num_of_elements_read = fread(input, sizeof input[0], N, fp)) > 0) {
  for (size_t j = 0; j < num_of_elements_read; j++) {
    printf(" %hd", input[j]);  // %d may also work, %hd is the better format
  }
}

答案 5 :(得分:-1)

你需要:

for (i = 0; i < 100; i++)
{
   fread(input, sizeof(short), 1, fp); 
   printf("%hd", input[0]);
}

或更好的选择:

fread(input, sizeof(short), 100, fp);
for (i = 0; i < 100; i++)
{ 
   printf("%hd", input[i]);
}

在你的情况下:

printf("%d",fread(input,sizeof(short),1,fp));

您正在打印fread的输出,但它不包含数据读取,它返回读取的数据量。请参阅here

返回值:

  

返回成功读取的元素总数。