- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试从文本文件中读取数据,然后将每个值除以 3,然后打印每个新值的输出值。
文本文件格式的示例如下所示:
0.00707946 -0.0241935 23.9401 0 0.307334 0.2046
characters
,但是,我的目标是将每个值除以我正在努力做的数字 3(
integer
)。
printf
中选择的格式说明符吗?陈述?或者选择显式转换为浮点数(我选择这样做是因为一些数字是浮点值)
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
int main()
{
char file_name[25];
int current_value = 0;
int new_value;
FILE *fp; //file handle
printf("Enter filename: \n");
gets(file_name);
fp = fopen(file_name, "r"); // read mode
//error handling
if (fp == NULL)
{
perror("Error while opening the file.\n");
getchar();
exit(EXIT_FAILURE);
}
while (fscanf(fp, "%d", ¤t_value) != EOF) //while end of file has not been detected
{
new_value = current_value / 3;
printf("%d ", new_value);
}
fclose(fp);
getchar();
return 0;
}
最佳答案
首先,永远,永远,永远使用gets()
,见 Why gets() is so dangerous it should never be used! .顺便说一句,您试图将每个字符除以 3
,而不是每个浮点值。 atoi
是字符串的整数转换,而不是单个字符。
但除此之外,您至少提供了一个善意的解决方案尝试。因此,让我们看看如何改进事情。首先,不要使用魔数(Magic Number),25
在您的代码中是一个魔数(Magic Number),而不是如果您需要一个整数常量,#define
一个,例如
#define _CRT_SECURE_NO_WARNINGS //preprocessor requirement
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define FNMAX 512 /* if you need a constant, define one (or more) */
int main (void) {
PATH_MAX
常数是
4096
.
25
甚至没有开始涵盖允许的文件名。
gets
与
fgets
.唯一需要注意的是,您现在必须修剪尾随
'\n'
从缓冲区。你可以简单地使用
strcspn
(这将报告不包括拒绝字符串中的字符数)。所以选择拒绝字符串
"\r\n"
覆盖你和
strcspn
返回到第一个字符的数量。您只需在覆盖行尾的索引处终止您的字符串,例如
printf ("Enter filename: ");
if (!fgets (file_name, FNMAX, stdin)) { /* validate EVERY input */
fputs ("(user canceled input)\n", stderr);
return 1;
}
file_name[strcspn(file_name, "\r\n")] = 0; /* trim '\n' from end */
fp
之前验证您的文件是否已打开以供阅读的工作做得很好.现在您只需要以读取浮点数而不是字符的方式继续。虽然我通常建议将剩余的行读入缓冲区,然后调用
sscanf
要从中解析值,您也可以使用
fscanf
一个接一个地读取浮点数。 (所有
scanf
转换,除了
"%c"
和
"%[...]"
丢弃前导空格)
fscanf
读取,然后除以
3
(这是我违反魔数(Magic Number)规则
:)
的地方,例如
/* read/print each floating-point value and value divided by 3 */
while (fscanf (fp, "%lf", &value) == 1)
printf ("\nvalue: %.4f\ndiv-3: %.4f\n", value, value / 3);
#define _CRT_SECURE_NO_WARNINGS //preprocessor requirement
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define FNMAX 512 /* if you need a constant, define one (or more) */
int main (void) {
char file_name[FNMAX];
double value;
FILE *fp; //file handle
printf ("Enter filename: ");
if (!fgets (file_name, FNMAX, stdin)) { /* validate EVERY input */
fputs ("(user canceled input)\n", stderr);
return 1;
}
file_name[strcspn(file_name, "\r\n")] = 0; /* trim '\n' from end */
/* open/validate file open for reading */
if ((fp = fopen (file_name, "r")) == NULL) {
perror ("fopen-file");
return 1;
}
/* read/print each floating-point value and value divided by 3 */
while (fscanf (fp, "%lf", &value) == 1)
printf ("\nvalue: %.4f\ndiv-3: %.4f\n", value, value / 3);
fclose(fp); /* close file */
getchar(); /* hold terminal open on windows */
return 0;
}
$ ./bin/readdivfloats
Enter filename: dat/floats.txt
value: 0.0071
div-3: 0.0024
value: -0.0242
div-3: -0.0081
value: 23.9401
div-3: 7.9800
value: 0.0000
div-3: 0.0000
value: 0.3073
div-3: 0.1024
value: 0.2046
div-3: 0.0682
getchar()
的原因由于您使用 Visual Studio IDE,您的代码末尾是在程序完成后保持终端窗口打开,您可能需要考虑仅对小型项目使用命令行。 (1) 您不必在 VS 中设置项目,(2) 您可以在设置另一个项目所需的时间内从同一目录编译许多不同的源文件,以及 (3) 您了解您的编译器选项需要,因此您可以告诉 IDE 您希望如何编译代码。
cmd.exe
(命令提示符)设置了适当的路径和编译器环境变量。 VS 编译器是
cl.exe
.编译这段代码(在文件名
readdivfloats.c
中)所需要做的就是:
cl /nologo /W3 /wd4996 /Ox /Fereaddivfloats readdivfloats.c
/Fe
选项只是命名生成的可执行文件,所以这里它将是
readdivfloats.exe
在同一目录中。我通常喜欢保持我的源目录干净,所以我创建
obj
和
bin
存放所有目标文件和可执行文件的子目录。
/Fo
选项让您命名目标文件(或者您可以简单地命名一个目录,目标文件将使用源文件的名称命名)。因此,考虑到这一点,将目标文件放在
.\obj
下面子目录和
exe
在
.\bin
子目录,您将使用:
cl /nologo /W3 /wd4996 /Ox /Foobj/ /Febin/readdivfloats readdivfloats.c
/W3
打开完整警告,
/wd4996
禁用警告
4996
, (烦人的
#define _CRT_SECURE_NO_WARNINGS
警告),
Ox
打开快速优化。您只需输入
cl /?
即可查看所有选项在终端。
关于c - 如何从文本文件中将数据作为字符读取,然后将每个字符除以一个 int,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55996112/
我正在尝试使用 y 组合器在 Scala 中定义 gcd: object Main { def y[A,B]( f : (A => B) => A => B ) : A => B = f(y(f)
我正在尝试了解返回指向函数的指针的函数,在我尝试编译代码后,它给了我这种错误: cannot convert int (*(int))(int) to int (*(int))(int) in ass
所以我一直在关注 youtube 上的游戏编程教程,然后弹出了这段代码:bufferedImageObject.getRGB(int, int, int, int, int[], int, int);
我正在将时间现在 与存储在数据库某处的时间进行比较。数据库中存储的时间格式为“yyyyMMddHHmmss”。例如,数据库可能会为存储的时间值返回 201106203354。然后我使用一个函数将时间现
例如 Maze0.bmp (0,0) (319,239) 65 120 Maze0.bmp (0,0) (319,239) 65 120 (254,243,90) Maze0.bmp (0,0) (
评论 Steve Yegge的post关于 server-side Javascript开始讨论语言中类型系统的优点和这个 comment描述: ... examples from H-M style
我正在研究 C 的指针,从 Deitel 的书中我不明白 int(*function)(int,int) 和 int*function(int, int) 表示函数时。 最佳答案 C 中读取类型的经验
您好,我使用 weblogic 11g 创建 war 应用程序,我对 joda time 的方法有疑问 new DateTime(int, int, int, int, int, int); 这抛出了
Create a method called average that calculates the average of the numbers passed as parameters. The
var a11: Int = 0 var a12: Int = 0 var a21: Int = 0 var a22: Int = 0 var valueDeterminant = a11 * a12
我正在为一个项目设置 LED 阵列。我得到了一个 LED 阵列,可以根据引脚变化电压进行更改,但我无法添加更多引脚。 当我尝试时,编译失败并显示错误:函数“int getMode(int, int,
除了创建对列表执行简单操作的函数之外,我对 haskell 还是很陌生。我想创建一个列表,其中包含 Int 类型的内容, 和 Int -> Int -> Int 类型的函数. 这是我尝试过的: dat
这个问题已经有答案了: Java add buttons dynamically as an array [duplicate] (4 个回答) 已关闭 7 年前。 StackOverFlow问题今天
我有几个 EditText View ,我想在其中设置左侧的图像,而 setCompoundDrawablesWithIntrinsicBounds 似乎不起作用。图形似乎没有改变。 有人知道为什么会
#include using namespace std; int main() { static_assert(is_constructible, int(*)(int,int)>::val
fun sum(a: Int, b: Int) = a + b val x = 1.to(2) 我在找: sum.tupled(x),或者 sum(*x) 当然,以上都不能用 Kotlin 1.1.3
有一个函数: func (first: Int) -> Int -> Bool -> String { return ? } 返回值怎么写?我对上面 func 的返回类型感到很困惑。 最
type foo = A of int * int | B of (int * int) int * int 和 (int * int) 有什么区别?我看到的唯一区别在于模式匹配: let test_
我正在尝试制作一个 slider 游戏。在这个类中,我使用 Graphics 对象 g2 的 drawImage 方法来显示“拼图”的 block 。但在绘制类方法中,我收到此错误:找不到符号方法dr
我试着理解这个表达: static Func isOdd = i => (i & 1) == 1; 但是这是什么意思呢? 例如我有 i = 3。然后 (3 & 1) == 1 或 i = 4。然后
我是一名优秀的程序员,十分优秀!