如何在c中将字符读回为int

如何在c中将字符读回为int,c,C,我正在滚动一个字符文件,并将其数据保存到一个数组中。该文件如下所示: 我删除了标题信息,因此它实际上是一个包含数字的文本文件。我想在我的程序中将这些字符数转换成字节,这样我就可以对它们做一些转换数学 我的代码如下: #include <stdio.h> #include <stdlib.h> #include "../DataProcessing/include/packet.h" int main ( int argc, char *argv[] ) { /

我正在滚动一个字符文件,并将其数据保存到一个数组中。该文件如下所示:

我删除了标题信息,因此它实际上是一个包含数字的文本文件。我想在我的程序中将这些字符数转换成字节,这样我就可以对它们做一些转换数学

我的代码如下:

#include <stdio.h>
#include <stdlib.h>

#include "../DataProcessing/include/packet.h"

int main ( int argc, char *argv[] )
{
    /*
    // We assume argv[1] is a filename to open
    FILE *file = fopen( argv[1], "r" );
    */

    FILE *file = fopen("C:\\log_hex.txt", "r");

    /* fopen returns 0, the NULL pointer, on failure */
    if ( file == 0 )
    {
        printf( "Could not open file\n" );
    }
    else 
    {
        int x;
        int count = 0;
        int byteArray[99999];
        /* read one character at a time from file, stopping at EOF, which
           indicates the end of the file.  Note that the idiom of "assign
           to a variable, check the value" used below works because
           the assignment statement evaluates to the value assigned. */
        while  ( ( x = fgetc( file ) ) != EOF )
        {
            byteArray[count] = x;
            printf( "%c", x );
            count++;
        }
        fclose( file );
        getchar();
    }
}
#包括
#包括
#包括“./DataProcessing/include/packet.h”
int main(int argc,char*argv[])
{
/*
//我们假设argv[1]是要打开的文件名
FILE*FILE=fopen(argv[1],“r”);
*/
FILE*FILE=fopen(“C:\\log\u hex.txt”、“r”);
/*fopen在失败时返回0,即空指针*/
如果(文件==0)
{
printf(“无法打开文件\n”);
}
其他的
{
int x;
整数计数=0;
int byteArray[99999];
/*每次从文件中读取一个字符,在EOF处停止,这
指示文件的结尾。请注意,习惯用法“assign”
对于变量,请选中下面使用的值“因为
赋值语句的计算结果为指定的值*/
而((x=fgetc(文件))!=EOF)
{
byteArray[计数]=x;
printf(“%c”,x);
计数++;
}
fclose(文件);
getchar();
}
}

byteArray用字符填充,但不是我想要的方式-我得到一个字符0,表示为数值53,4表示为52,空格表示为32。。。。如何读取字符号,并使该数字成为byteArray中的字符值?

您正在读取ascii中的字节值。您需要使用库函数(如
strtol
)来转换为实际值

虽然我认为你的问题中有一个输入错误,但我怀疑
0
是否会显示为
53
,这是
3
的ascii码

如果你知道它是一个数字,你可以这样做

x-='0';

获取值。

请注意,您正在整数数组中存储字符值。此外,您正在以字符格式打印一个整数值

由于输入文件中有多个数字,您可能需要一个字符缓冲区来存储整个数字(一系列数字,例如,在读取空格之前读取数字字符)。在此之后,您需要使用strtol将缓冲区转换为整数,如前所述


要测试结果,请确保在printf中使用正确的格式。使用
%d“
表示整数,
%c”
表示字符等。

您正在查找的是
strtol()
。可能是@H2CO3的副本:为什么不使用scanf,因为他已经打开了一个文件?@andyn,因为
scanf()
是邪恶的,不会像您想象的那样做。但如果你愿意的话,那就说吧……这不是十进制数字,而是十六进制数字。@Oliver Matthews这是我得到的截图——也许是
0x53
。你能解释一下
x-='0'
是如何工作的吗?哦,你的意思是[0]将以53的形式出现。这是有道理的-第一个数字是5“0”之所以有效,是因为字符“0”和ascii值48相同,而且ascii将0-9按48-57(dec)的顺序存储。您可以轻松地编写
x-=48,只是
-“0”
让你做的事情更清楚了。@OliverMatthews:为了清楚起见,它们不是等价的。C不需要ASCII字符集,但不管您有什么字符集,它都要求十进制数字是连续的,并且是有序的。因此,对于
char c
,其中
c
是一个十进制数字,
c-=“0”
保证为您获取它所代表的数字的值<如果您的实现没有使用
'0'==48
的字符集,那么code>c-=48
就不能保证得到这个结果。我正在努力使用这个字符缓冲区/读取直到空格编码,您会怎么做?有点晚了,但类似这样的事情:声明一个
字符buf[3]
。然后在主循环中使用另一个循环,
while(x!='')
确保读取buf中的整数,而不仅仅是一个数字。然后使用strtol将buf转换为int。每次读取数字后,将buf设置为'\0'。