如何将文件中的值存储到数组中?
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
我想将 1
s 和 0
s 存储在一个数组 (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 位数字,并且总是 0
或 1
,应该这样做:
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()
的库函数更具表现力,这就是为什么没有人这样做的原因。
【讨论】:
以上是关于如何将文件中的值存储到数组中?的主要内容,如果未能解决你的问题,请参考以下文章