【问题标题】:how to read back a char as an int in c如何在c中将char作为int读回
【发布时间】:2013-08-08 14:24:28
【问题描述】:

我正在滚动一个字符文件并将其数据保存到一个数组中。文件如下所示:http://pastebin.com/dx4HetT0

我已经删除了标题信息,因此它实际上是一个带有数字的文本文件。我想在我的程序中将这些 char 数字转换为字节,以便对它们进行一些转换数学运算。

我的代码如下:

#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();
    }
}

byteArray 被字符填充但不是以我想要的方式填充 - 我得到一个字符 0 表示为数值 53,4 表示为 52,空格表示为 32....我该如何阅读字符编号,并将该编号设为我的 byteArray 中的 char 值?

【问题讨论】:

  • 您正在寻找strtol()
  • @H2CO3:为什么不scanf,因为他已经打开了一个文件*?
  • @andyn 因为scanf() 是邪恶的,不会做你认为的那样。但是,如果您愿意,请继续...

标签: c


【解决方案1】:

您正在以 ascii 格式读取字节值。您需要使用像 strtol 这样的库函数来转换为实际值。

虽然我认为你的问题中有一个错字 - 我怀疑 0 是作为 53 出来的,那是 3 的 ascii

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

x-='0';

获取价值。

【讨论】:

  • 不是十进制数,而是十六进制数。
  • @Oliver Matthews 这是我返回的截图 - snag.gy/gEyJa.jpg 也许那是 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 的字符集,c -= 48保证可以为您提供此功能。
【解决方案2】:

请注意,您将 char 值存储在整数数组中。此外,您正在以 char 格式打印整数值。

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

要测试您的结果,请确保在 printf 中使用正确的格式。 "%d" 用于整数,"%c" 用于字符等。

【讨论】:

  • 我正在努力处理这个字符缓冲区/读取直到空格代码,你会怎么做?
  • 有点晚了,但是像这样:声明一个char buf[3]。然后在主循环中使用另一个循环,while(x!=' ') 以确保您读取 buf 中的整数,而不仅仅是一个数字。然后使用 strtol 将 buf 转换为 int。在读取每个数字后将 memset buf 设置为 '\0'。
猜你喜欢
  • 2017-11-21
  • 2012-06-04
  • 2015-09-07
  • 2011-03-31
  • 2017-01-18
  • 2015-07-11
  • 1970-01-01
  • 1970-01-01
  • 2020-07-16
相关资源
最近更新 更多