- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
数周以来,我一直在努力学习如何使用C进行编程,但是我处于无法摆脱困境的地步。我的程序应该读取包含四个和五个波段电阻器颜色代码(即AGIE)的文件,其中每个字母代表一个电阻器波段颜色,然后使用标准电阻器波段解释表打印电阻器的值以及公差上限和下限。
到目前为止,我认为我正在正确读取文件;但是,我的函数无法产生任何结果,而且我不知道尝试破译4个或5个频段的去向。
输入示例为:(其中604是文件中电阻器代码的数量)
604
CCIF
IJFCJ
CFHJ
BJFG
KIJDJ
EKCC
HABKC
JFID
ECHDA
IJHEB
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
void FourBR(char ccode[], long cval[], double rval);
void FiveBR(char ccode[], long cval[], double rval);
int main()
{
//DECLARE VARIABLES AND POINTERS//
char str[604];
char ccode[6];
long cval[6];
int num, i;
double resistorval, rval;
FILE *fpin;
FILE *fpoutpt;
//OPEN FILE//
fpin=fopen("G:\\EGR 107\\EEHW4(AGraff)\\resistorInput.txt", "r");
fpoutpt=fopen("G:\\EGR 107\\EE\\EEHW4(AGraff)\\resistorOutput.txt", "w");
//ERROR CHECK//
if(fpin==NULL)
{
printf("Error reading file.\n");
exit (0);
}
fscanf(fpin, "%d", &num);
printf("# of Resistors: %d\n", num);
while((fgets (str, 604, fpin))!= NULL) {
FourBR(ccode, cval, rval);
FiveBR(ccode, cval, rval);
fclose(fpin);
return 0;
}
void FourBR(char ccode[], long cval[], double rval)
{
int i, j, k, mult;
for(i=0; i<=6; i++) {
switch (ccode [0]) {
case('A'):
cval[0]=0;
case('B'):
cval[0]=1;
case('C'):
cval[0]=2;
case('D'):
cval[0]=3;
case('E'):
cval[0]=4;
case('F'):
cval[0]=5;
case('G'):
cval[0]=6;
case('H'):
cval[0]=7;
case('I'):
cval[0]=8;
case('J'):
cval[0]=9;
}
}
for(j=0; j<=6; j++)
{
switch (ccode[1])
{
case 'A':
cval[1]=0;
case('B'):
cval[1]=1;
case('C'):
cval[1]=2;
case('D'):
cval[1]=3;
case('E'):
cval[1]=4;
case('F'):
cval[1]=5;
case('G'):
cval[1]=6;
case('H'):
cval[1]=7;
case('I'):
cval[1]=8;
case('J'):
cval[1]=9;
}
}
for (mult=0; mult<=6; mult++)
{
switch (ccode[2])
{
case('A'):
cval[2]=1;
case('B'):
cval[2]=10;
case('C'):
cval[2]=100;
case('D'):
cval[2]=1000;
case('E'):
cval[2]=10*pow(10,3);
case('F'):
cval[2]=10*pow(10,4);
case('G'):
cval[2]=10*pow(10,5);
case('H'):
cval[2]=10*pow(10,6);
case('I'):
break;
case('J'):
break;
case('K'):
cval[2]=0.1;
case('L'):
cval[2]=0.01;
}
}
for (k=0; k<=6; k++) {
switch (ccode[3]) {
case 'A':
break;
case('B'):
cval[3]=0.01;
case('C'):
cval[3]=0.02;
case('D'):
break;
case('E'):
break;
case('F'):
cval[3]=0.005;
case('G'):
cval[3]=0.0025;
case('H'):
cval[3]=0.001;
case('I'):
cval[3]=0.0005;
case('J'):
break;
case('K'):
cval[3]=0.05;
case('L'):
cval[3]=0.1;
}
}
}
最佳答案
由于我不完全了解您的颜色映射代码方案,因此我认为以下内容将对您的项目有所帮助。为了下面的代码,我让A-J
在电阻器图表上提供0-9
的映射,以向您展示一种将代码映射到电阻器值的方法。 (如果输入代码包含'K'
或更高版本,则会将其踢出-您可以填写该逻辑)
注意:以下代码仅提供了有效数字色带的映射(4频段的带/字符1和2,5频段电阻的为1、2和3)。有效数字值乘以乘数(4频段中的频段3和5频段电阻器中的频段4)得出一个电阻值。 (公差被忽略)。
在任何项目中需要做的第一件事之一就是掌握要处理的值的范围,以便选择哪种数据类型将足以保留值,同时又不会不必要地浪费内存。查看您的输入,您将读取最多5个字符的字符串。请注意,以文件'\n'
结尾的行也是fgets
会尝试读取的字符,并且您需要在末尾保留null-terminating
字符'\0'
的空间。因此,用于读取输入文件的最小字符串大小为7
。 (尽管您可以省去最少的费用,但还是明智的做法是添加几个其他字符,以防您将代码移植到dos上并要处理'\r\n'
行尾,或者文件中有一个或两个杂散字符) 。原因选择在9-10
范围内。现在,无需在整个代码中对10
进行硬编码,而是在文件的开头使用一次#define
来设置此值一次。 (例如,#define LMAX 10
-“最大行数”不使用分号)。如果需要,您将来可以轻松调整该值。
同样的逻辑适用于其余变量。根据经验,如果范围同时包含正值和负值,请选择int
或long
。如果这些值始终为正,请选择size_t
或unsigned
等。这有助于快速使用参考:
data type sizes for x86_64:
sizeof (char) : 1
sizeof (char*) : 8 (all pointers)
sizeof (short) : 2
sizeof (int) : 4
sizeof (long) : 8
sizeof (long long) : 8
data type storage sizes for x86_64:
char - signed : -128 to 127
char - unsigned : 0 to 255
short - signed : -32768 to 32767
short - unsigned : 0 to 65535
int - signed : -2147483648 to 2147483647
int - unsigned** : 0 to 4294967295
(l)long - signed : -9.2234e+18 to 9.2234e+18
(l)long - unsigned : 0 to 1.8447e+19 18446744073709551613
** size_t is an unsigned int for practical purposes
argv[1], argv[2], ...
),只需使用
int main (int argc, char **argv)
,您就有一个字符串数组,这些字符串是
argv
中代码的参数(argv [0]始终是用于运行程序的程序名称)。当您将参数传入/传出代码或传递给代码中的函数时,请验证/验证输入。
308
的来源),并且您开始尝试一种转换方法,但是车轮掉下来的地方差不多。在您的函数中,您了解到需要查看每个字符并将该字符值映射到数字,但是您迷上了需要什么
numeric
(十进制)值和什么需要是
character
值? (这也需要学习和密切关注)
5
(最大5频段),则您知道对于4频段和5频段电阻器,重要的数字频段将是
0 < (length-2)
之间的字符。使用
switch statement
的方法很好,但是有一些技巧可以帮助您。
string[length-2]
处)
switch
进行有效数字转换,而是查看
[ASCII Table and Descriptions]。请注意,字符
'A'
的ASCII值为
65
,而
'J'
的值为
74
。您可以使用字符值之间的差异,通过将差异添加到字符
'0'(48)
来将字母转换为字符数字。 (即
'G'(71) - 'A'(65) = 6
-
'0'(48) + 6 = 54
[字符
'6'
])您希望转换后的字符串中的每个值都具有数字的字符值。 (例如,不是十进制值
6
)。注意与您的
switch
语句所做的细微差别。 (它是为
cval[x]
分配小数而不是字符值,要修正它,您必须引用数字)。除非您要手动将数字转换(在您的情况下为
cval
数组)转换为数字,否则所有转换例程
atoi, strtol, etc..
都希望接收到一个充满字符值的字符串,而不是十进制字符串。
10
提升为该幂来找到乘数位值。 (不需要数学库,将执行一个快速循环。)为
1
的乘数变量选择一个初始值,可以在将波段转换为值后快速计算乘数。一个简单的循环即可将乘数乘以带指示的次数10。
ccode
收集字符数字,然后调用转换为数字
cval
的值-与您的命名相反)。另外请注意,程序唯一需要的参数是输入文件。如果未提供输出文件,它将仅将输出与错误消息一起转储到屏幕上。 (方便开发)
#include <stdio.h>
#include <stdlib.h> /* for strtol */
#include <string.h> /* for strlen */
#include <errno.h> /* for errno */
#define LMAX 10
unsigned long resistor_val (char *s, unsigned char len);
int main (int argc, char **argv)
{
if (argc < 2 ) {
fprintf (stderr, "Error: insufficient input, usage: %s infile [outfile]\n", argv[0]);
return 1;
}
char str[LMAX] = {0}; /* input buffer (LMAX-1 chars) */
FILE *ifp = NULL; /* input file pointer */
FILE *ofp = NULL; /* output file pointer (stdout) */
size_t idx = 0; /* line index / counter */
size_t nchr = 0; /* number of chars in str */
unsigned long rval = 0; /* resistor value from ccode */
/* open/validate input file */
if (!(ifp = fopen (argv[1], "r"))) {
fprintf (stderr, "error: file open failed '%s'\n", argv[1]);
exit (EXIT_FAILURE);
}
/* open/validate output file (default: stdout) */
if (argc > 2) {
if (!(ofp = fopen (argv[2], "w"))) {
fprintf (stderr, "error: file open failed '%s'\n", argv[2]);
exit (EXIT_FAILURE);
}
}
else
ofp = stdout;
/* read loop - read each line in the input file */
while (fgets (str, LMAX, ifp) != NULL)
{
/* get the length of each string read */
nchr = strlen (str);
/* strip CR & LF from each line */
while (nchr > 0 && (str[nchr-1] == '\r' || str[nchr-1] == '\n'))
str [--nchr] = 0;
/* call resistor_val function, output results (or line if error) */
if ((rval = resistor_val (str, nchr)))
fprintf (ofp, " line[%3zu] code: %-5s rval: %lu\n", idx, str, rval);
else
fprintf (ofp, "*line[%3zu] code: %-5s\n", idx, str);
idx++;
}
/* close input/output files */
if (ifp) fclose (ifp);
if (ofp != stdout) fclose (ofp);
return 0;
}
/* read resistor colors presuming 4 or 5 band resistor
where the last band indicates 'tolerence', and the
band before it is the 'multiplier'. On success return
the ohm value for the resistor before any tolerence
or reliability factors are applied, 0 otherwise.
presumes code values of [A-J] only!
*/
unsigned long resistor_val (char *s, unsigned char len)
{
char ccode[LMAX] = {0}; /* array to hold numbers */
unsigned long cval = 0; /* converted ccode value */
unsigned char idx = 0; /* ccode index / counter */
unsigned char it = 0; /* loop iterator */
unsigned long mult = 1; /* multiplier for resistor */
/* validate input string and length */
for (it = 0; it < len; it++)
if ((s[it] < 'A' || s[it] > 'J') {
fprintf (stderr, "%s() error: argument contains chars outside [A-J] : '%s'.\n",
__func__, s);
return 0;
}
if (len > 5) {
fprintf (stderr, "%s() error: input exceeds 5 characters\n", __func__);
return 0;
}
/* set the numeric value for each resistor value character */
for (idx = 0; idx < len - 2; idx++)
ccode[idx] = '0' + s[idx] - 'A';
/* set the multiplier for the resistor */
for (it = 0; it < s[len - 2] - 'A'; it++)
mult *= 10;
/* convert ccode to a number */
errno = 0;
cval = strtoul (ccode, NULL, 10);
if (errno) {
fprintf (stderr, "%s() error: invalid cval conversion.\n", __func__);
return 0;
}
/* return multiplier times cval */
return mult * cval;
}
gcc -Wall -Wextra -g -o resistors resistors.c
-g
(生成调试信息)以进行最终编译,但是如果要使用
gdb
调试器,则需要这样做。 (必须了解
gdb
)。
$ ./bin/resistors dat/resifile.txt dat/resfile.txt
resistor_val() error: argument contains chars outside [A-J] : '604'.
resistor_val() error: argument contains chars outside [A-J] : 'KIJDJ'.
resistor_val() error: argument contains chars outside [A-J] : 'EKCC'.
resistor_val() error: argument contains chars outside [A-J] : 'HABKC'.
$ cat dat/resfile.txt
*line[ 0] code: 604
line[ 1] code: CCIF rval: 2200000000
line[ 2] code: IJFCJ rval: 89500
line[ 3] code: CFHJ rval: 250000000
line[ 4] code: BJFG rval: 1900000
*line[ 5] code: KIJDJ
*line[ 6] code: EKCC
*line[ 7] code: HABKC
line[ 8] code: JFID rval: 9500000000
line[ 9] code: ECHDA rval: 427000
line[ 10] code: IJHEB rval: 8970000
关于c - C,读取文件,解释文件,将解释输出到新文件中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29267958/
我遇到以下问题。我想读取一个包含数百万行和数百列的大型 csv。我想向下转换列的数据类型。我的方法是读取 csv,然后使用 pd.to_numeric() 对其进行向下转换。我不知道列数及其类型。在读
目前,我从 SQL server (2008) 数据库获取数据。 cyurrent的方法是使用DataTable,然后将其传递并使用。 if (parameters != null)
我有以下问题。我有一个巨大的 csv 文件,想用多处理加载它。对于一个包含 500000 行和 130 列不同数据类型的示例文件,Pandas 需要 19 秒。我试过 dask 因为我想多处理阅读。但
是否有关于用于序列化各种 MFC 数据结构的二进制格式的明确文档?我已经能够在十六进制编辑器中查看我自己的一些类,并使用 Java 的 ByteBuffer 类读取它们(使用自动字节顺序转换等)。 但
我正在使用 Selenium 进行测试,我们用 HTML 文件编写测试用例,并用它们制作测试套件,我们的要求是编写足够健壮的测试用例,以根据测试环境改变自身。 为此,我不希望在 HTML 脚本本身中包
我需要一个 JavaScript 代码来读取存储为 .txt 文件的字典(或者也可以保存为任何其他类型的文件。它也可以在线获得)并将其内容存储在一个变量中。我不能找到一种让 JavaScript 像
我正在尝试遍历包含 SSH 登录和其他日志的日志文本文件。 程序正在返回 SSH 登录的总数。 我的解决方案确实有效,但似乎有点慢(在 200mo 文件上大约需要 3.5 秒)。我想知道是否有任何方法
我正在将大量数据从一个电子表格复制到工作簿中的其他 160 个电子表格。目前,Excel (2013) 遇到错误,因为它没有足够的资源来完成操作。 我的目标是将工作表 4 中 V13:XI1150 范
我正在尝试读取一个有 1147 行的文本文件。下面的代码仅读取第 1050-1147 行。我的目标是读取整个文件并提取位于不同行的特定值以在脚本中使用。一个示例是包含“BlockList: 2”的行中
我正在为游戏编写解释器。用户将其移动输入解释器,程序执行该移动。 现在我想为每个决定实现一个时间限制。玩家不应该能够思考超过 30 秒来写一个移动并按下回车。 call_with_time_limit
以this file例如,我正在尝试读取 data.frame 中的数据。来自 the doc (pdf 文件,表 1),它遵循一些 fortran 约定。我尝试了以下但收效甚微: dir 0' 将
我正在使用 R 阅读 Outlook 附件。我的引用在这里:Download attachment from an outlook email using R 这是我的电子邮件的截图: 这每天都会发送
我不会从表格中读取行来将主题放在列表中 php脚本 $url_obj='http://'.$host.':8069/xmlrpc/object'; $sock=new xmlrpc_client($u
我有一个这样的 csv 文件: id,name,value 1,peter,5 2,peter\,paul,3 我如何读取此文件并告诉 R "\," 不表示新列,仅表示 ","。 我必须添加该文件
我正在尝试读取 ~/Library/Preferences/com.apple.mail.plist (在 Snow Leopard 上)以获取电子邮件地址和其他信息以进入“关于”对话框。我使用以下代
This question already has answers here: How do I use floating-point division in bash? (19个回答) 5个月前关闭
本练习的目标是读取输入文件并将其存储到表中,然后验证输入中的某些字段并输出任何错误记录。我需要读取并存储每个策略组,以便表中一次仅存储 5 条记录,而不是整个文件。 所以我需要读取一个包含 5 条记录
据我了解,LWT 插入始终以 SERIAL 一致性级别完成。如果为 true,这是否意味着读取作为 LWT 插入的行可以安全地以 ANY 的一致性级别读取? 换句话说,我假设 LWT 插入是完全一致的
我看到很多很多通过java脚本读取cookie的函数,但我只想在变量中使用它一次,我是JS新手。 这是我的代码 var TheNumber = (Math.random() + '') * 10000
我正在使用 asp.net 和 C#。我在服务器上部署了一个应用程序[已发布],现在我想查看该网站的代码,据我所知,我可以阅读程序集来查看代码。 请告诉我如何实现它。 提前致谢。 最佳答案 您可以使用
我是一名优秀的程序员,十分优秀!