使用 getchar() 从文件中读取

Using getchar() to read from file

我有一个作业,基本上我想使用 getchar() 从音频文件中读取所有字节,如下所示: while(ch = getchar()) != EOF) 在某些时候,我必须读取代表 文件大小 的 4 个连续字节,我无法理解以下内容: 例如,如果我的程序正在读取的文件大小为 150 个字节,则足以存储在 4 个字节中的 1 个字节中,这意味着在这种情况下,其中 3 个字节将为 0,最后一个字节将为 150。我知道我需要读取所有 4 个字节,通过 cod 上面部分中的 while 的 4 次重复,以获得我需要的所有信息,但是 getchar() 到底是什么 return 到我的变量,因为它 return 是它刚刚读取的字符的 ASCII 码? 对于不能存储在单个字节中的较大数字,还会发生什么情况?

无法评论,因为我没有足够的声誉,我对你的问题深感困惑,因为我不明白你的意思或你想达到什么目的 函数 getChar() 应该一次用于 returning 主要是一个字节,事实上,只有在阅读你的问题后,我才检查手册以了解它读取了不止一个,尽管根据我的经验和测试我现在执行它似乎用于读取多字节字符这是我用来检查它的简单代码

    char * c;
    printf("Enter character: ");
    c = getchar();
    printf("%s",c);

我使用的字符可能会取消格式化,这是我在多边形栏中使用的堆栈溢出字形滑,在这里它显示为亚洲字符。

不仅如此,如 linux 手册所述,当到达文件末尾(或发生错误时)时,fgets 将 return EOF https://linux.die.net/man/3/getchar

此外,在进一步阅读时,它取决于文件如何存储数据,如果它是大端,则读取的第一个字节将为 0,0,0,150,否则如果它是小端,则为 150,0,0,0,但就是这样假设它一次读取 1 个字符,而不是像您描述的那样一次读取 4 个字符

至于你的问题的“解决方案”,为什么不使用 fread() 一次读取 4 个字节或它正确工作时的派生?

编辑 正如评论所问,以下按位“连接”我使用 scanf 的值,因为我懒得手动检查每个 ASCII 键,这假设文件是​​大端,即 0,0,0,150 否则反转顺序<< 完成了,它应该“just werk™”

#include <stdio.h>
#include <stdlib.h>
unsigned char c[4];
unsigned int dosomething(){
    unsigned int result=0;
    result= (unsigned int)c[0]<< 24 | (unsigned int)c[1]<< 16 | (unsigned int)c[2]<< 8 | (unsigned int)c[3];
    return result;
}
int main(int argc, char const *argv[]){
    
    for (size_t i = 0; i < 4; i++)
    {
        printf("Enter character: ");
        scanf ("%u", &c[i]);
        printf("%u\n", c[i]);
        //printf("%s",c);
    
    }
    printf("%u",dosomething());
    
  
    return 0;
}

现在 fread 的用法如下 fread(pointertodatatoread, sizeofdata, sizeofarray, filepointer); 为了深入了解这里是手册: https://www.tutorialspoint.com/c_standard_library/c_function_fread.htm 这应该在不同的线程中提出,因为我觉得我在问另一个问题

If the file my program is reading is for example 150 bytes in size, that is enough to be stored in 1 of the 4 bytes, which means that 3 of the bytes will be 0 and the last one will be 150 in that case. I understand that I need to read all 4 bytes in order to get all the information I need, but what exactly is getchar() going to return to my variable, as it returns the ASCII code for the character it just read?

getchar 对 ASCII 一无所知。它return是它读取的字节的数值,如果它不能读取一个字节,则用EOF表示一个特殊的代码。如果您将字节视为 ASCII 码,那么这就是 解释.

的问题

因此,如果您的文件大小编码为三个零字节后跟一个值为 150 的字节,那么 getchar() 将 return 为 0、0、0 和 150 四个连续调用。