我发誓,我在问这里之前已经研究了很多,但找不到任何有用的东西。
我有一个扩展名为.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;,我得到了相同的结果。哪个是传播文件的理想方式?
**编辑: 最后,我的文件实际上是空的:( 无论如何,这里的答案有用,并且学到了很多东西
答案 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。
返回值:
返回成功读取的元素总数。