如何将文件中的值存储到数组中?

Posted

技术标签:

【中文标题】如何将文件中的值存储到数组中?【英文标题】:How do I store a value in a file to an array? 【发布时间】:2021-07-04 18:50:44 【问题描述】:

我有一个txt 文件,如下所示:

1:0
2:0
3:1
4:0
...
99:1
100:1

我想将 1s 和 0s 存储在一个数组 (slot[]) 中,(不管 ':'s 的左侧是什么),但我不能弄清楚如何。这是我的代码的 sn-p:

while((ch=fgetc(fptr)) != EOF) 

     if(ch == ':')
     
       slot[j] = fgetc(fptr);       //saves the character right after ":"into slot[j]?
       j++;
     

我知道它比这更复杂,因为它不起作用。找了很久还是没找到,可能是因为我没有搜索到正确的字词。

我该如何解决这个问题?

提前致谢。

【问题讨论】:

看strtock函数 您希望您的结果是什么样的?根据冒号右侧的内容,插槽应该是“10011 ...”字符串吗?您当前的问题是什么/哪些行为与您希望的不同? @JayK id 喜欢它是一个数组或 100 个值,所以在这种情况下 [0,0,1,0 ... ,1,1] 我认为这是我对我的方式的误解必须这样做。目前,数组中没有任何内容 使用fgets 读取整行。然后使用strchr 查找冒号。冒号后面的字符就是你要找的字符。 请包含周围的代码,包括插槽变量的声明和可能的初始化以及如何打印结果。 【参考方案1】:

有些细微的变化看起来很简单,因为你的规范规定右边总是有 1 位数字,并且总是 01,应该这样做:

if (fptr != NULL)

    int ch;
    int j = 0;

    while ((ch = fgetc(fptr)) != EOF)
    
        if (ch == ':') 
        
            if ((ch = fgetc(fptr)) != EOF) // get digit after :
            
                slot[j++] = ch - '0';  // for int array *
                //slot[j++] = ch;      // for char array
            
            else
            
                break;
            
        
    

或者,对于使用fgets 的更强大的方法:

if (fptr != NULL)

    char temp[100]; // must be large enough to hold the line
    char *ch;
    int j = 0;

    while (fgets(temp, sizeof temp, fptr)) // read whole line
    
        ch = strchr(temp, ':'); // find :
        if (ch != NULL && (ch[1] == '1' || ch[1] == '0'))
        
            // add next digit to slot[] if it's 1 or 0
            slot[j++] = ch[1] - '0'; // or remove - '0' for char slot[]
        
    

strchr 需要 string.h 标头。

*如果您想了解更多关于字符到数字转换的信息,请查看此帖子:

Why is there a need to add a '0' to indexes in order to access array values?

【讨论】:

@IradOhayon 这有什么变化? @anastaciu 有效!它符合我的需要。如果我需要多于一位,该怎么办? @SwanBones,关于+ 是什么的问题,它使用数字编码将字符转换为整数的简单字符艺术,查看这篇文章以获得更详细的解释***.com/a/60994407/6865932 @SwanBones,取决于您尝试解析的代码应该有所不同,假设您仍然想要 1 和 0,但您还有其他 1 位值,那么您需要添加 if(ch == '1' || ch == '0')在将其添加到数组之前。如果您有超过 1 位数字,那么您需要检查下一个字符,如果它是 \n,那么该值为 1 位数字,如果不是,则可能更多,这一切都取决于您所追求的特定规格.【参考方案2】:

它没有达到您期望的原因是因为您正在阅读字符并期望它们是数字。 C 中的字符具有整数值。该映射称为 ASCII(在 Internet 上搜索“ASCII 表”)。大写字母从 65 开始,小写字母从 97 开始,数字从 48 开始。因此,如果“0”是 48,“1”是 49,您可以将“0”和“1”更改为 0, 1 分别减去 48:

slot[j] = fgetc(fptr) - 48;

这行得通,但后来你会忘记 48 的含义,不得不再次查看 ASCII 表,所以你应该使用字符:

slot[j] = fgetc(fptr) - '0';

它做同样的事情,但很明显你为什么要减去一个值。

您可以使用相同的技巧将大写转换为小写:

if (ch >= 'A' && ch <= 'Z') ch += 32;

或小写转大写:

if (ch >= 'a' && ch <= 'z') ch -= 32;

当然,还有一些名为 tolower()toupper() 的库函数更具表现力,这就是为什么没有人这样做的原因。

【讨论】:

以上是关于如何将文件中的值存储到数组中?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Objective-C 中显示存储在数组中的值

如何将 Console.ReadLine 中的值添加到数组中?

如何将文件中的字符存储到数组中

如何获取存储在数组中的类中的值?

Python:将 3D 数组中的值存储到 csv

使用猫鼬模式将多个选择元素值中的值存储到MongoDB中的数组中