gpt4 book ai didi

c - 如何从文本文件中将数据作为字符读取,然后将每个字符除以一个 int

转载 作者:太空宇宙 更新时间:2023-11-04 06:47:38 25 4
gpt4 key购买 nike

我正在尝试从文本文件中读取数据,然后将每个值除以 3,然后打印每个新值的输出值。

文本文件格式的示例如下所示:

0.00707946 -0.0241935 23.9401 0 0.307334 0.2046

从上面的例子可以看出,每个值都用空格隔开,有效数字的个数不一样,数字可以是正数也可以是负数。我可以成功通读并将值打印到 cmd 为 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", &current_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) {

另外,不要吝啬缓冲区大小!在 Linux 上,默认 PATH_MAX常数是 4096 . 25甚至没有开始涵盖允许的文件名。

接下来,替换 getsfgets .唯一需要注意的是,您现在必须修剪尾随 '\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 您希望如何编译代码。

如果使用VS,它提供了“VS Developers Command Prompt”,它只是一个 cmd.exe (命令提示符)设置了适当的路径和编译器环境变量。 VS 编译器是 cl.exe .编译这段代码(在文件名 readdivfloats.c 中)所需要做的就是:
cl /nologo /W3 /wd4996 /Ox /Fereaddivfloats readdivfloats.c
/Fe选项只是命名生成的可执行文件,所以这里它将是 readdivfloats.exe在同一目录中。我通常喜欢保持我的源目录干净,所以我创建 objbin存放所有目标文件和可执行文件的子目录。 /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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com