- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在我的程序的下面的函数中,我试图从文本文件中读取数字,并将它们相应地输入到结构 x,y,mass 的数组中。文本文件如下所示:
1 2 3 //first number is x, second is y, and third is mass
1 2 3
1 2 3
#include <stdio.h>
#include <stdlib.h>
#define MAX 100
struct cg {
float x, y, mass;
}masses[MAX];
int readin(void)
{
FILE *file = fopen("test.txt", "r");
int count;
if (file == NULL) {
printf("Error: can't open files.\n");
return 1;
}
else {
while (1) {
char c = fgetc(file);
if (c != EOF) {
if (count == 0) {
masses[count].x = c;
}
else if (count == 1)
{
masses[count].y = c;
}
else if (count == 2)
{
masses[count].mass = c;
}
if (count != 3) {
count++;
}
else { count = 0; }
}
else {
break;
}
}
}
fclose(file);
}
到目前为止我写了这篇文章,但我不知道我是否走正确的路
最佳答案
如果您刚刚开始,请正确开始。当您解决需要读取行数据的问题时,请使用面向行的输入函数来读取数据(例如fgets
或POSIX getline
)。这允许您验证读取,并且与解析该行中的值分开。
读取并验证一行数据后,您可以将该数据解析为您需要的任何值。有很多可用的工具。 sscanf
、strtod
、strtok
或者只是将指针遍历行缓冲区中的每个字符,逐个字符进行比较并获取需要采取行动。
这里,sscanf
提供了一种非常方便的方法来从一行文本中解析 3 个浮点值。 (对于任何与工程相关的工作,请使用double
而不是float
,并且始终使用整数值作为货币)。如果您不知道从每行读取了多少个值,那么在缓冲区中遍历 strtod 就可以了。
验证,验证,验证。如果你读过它——验证你读到的内容。如果您转换它 - 验证您的转换是否发生(如果需要,该值是否在预期范围内)。
将这些部分放在一起,您可以执行类似于以下的操作,将每行的 3 个值读取到结构数组中(最多 MAX 元素)。该代码期望将文件名作为第一个参数读取(或者如果未给出参数,则默认从 stdin
读取):
#include <stdio.h>
enum { NMEMB = 3, MAX = 100, MAXC = 512 };
typedef struct {
double x, y, mass;
} cg;
int main (int argc, char **argv) {
int n = 0; /* masses index */
char buf[MAXC] = ""; /* buffer for each line */
cg masses[MAX] = {{ .x = 0 }}; /* array of cg initialized to 0 */
FILE *fp = argc > 1 ? fopen (argv[1], "r") : stdin;
if (!fp) { /* validate file open for reading */
fprintf (stderr, "error: file open failed '%s'.\n", argv[1]);
return 1;
}
while (n < MAX && fgets (buf, MAXC, fp)) { /* read each line */
cg tmp = { .x = 0 }; /* temporary struct */
/* you should validate complete line read here */
/* parse values into tmp and validate */
if (sscanf (buf, "%lf %lf %lf", &tmp.x, &tmp.y, &tmp.mass) == 3)
masses[n++] = tmp; /* assign tmp to massess, increment n */
}
if (fp != stdin) fclose (fp); /* close file if not stdin */
for (int i = 0; i < n; i++)
printf ("masses[%2d] %5.2f %5.2f %5.2f\n",
i, masses[i].x, masses[i].y, masses[i].mass);
return 0;
}
(注意:我已经将整行作为练习进行了验证。strlen
,然后检查最后读取的字符是否为'\n '
就足够了)
输入文件示例
$ cat ../dat/int3x20.txt
21 61 78
94 7 87
74 1 86
79 80 50
35 8 96
17 82 42
83 40 61
78 71 88
62 20 51
58 2 11
32 23 73
42 18 80
61 92 14
79 3 26
30 70 67
26 88 49
1 3 89
62 81 93
50 75 13
33 33 47
示例使用/输出
$ ./bin/cg ../dat/int3x20.txt
masses[ 0] 21.00 61.00 78.00
masses[ 1] 94.00 7.00 87.00
masses[ 2] 74.00 1.00 86.00
masses[ 3] 79.00 80.00 50.00
masses[ 4] 35.00 8.00 96.00
masses[ 5] 17.00 82.00 42.00
masses[ 6] 83.00 40.00 61.00
masses[ 7] 78.00 71.00 88.00
masses[ 8] 62.00 20.00 51.00
masses[ 9] 58.00 2.00 11.00
masses[10] 32.00 23.00 73.00
masses[11] 42.00 18.00 80.00
masses[12] 61.00 92.00 14.00
masses[13] 79.00 3.00 26.00
masses[14] 30.00 70.00 67.00
masses[15] 26.00 88.00 49.00
masses[16] 1.00 3.00 89.00
masses[17] 62.00 81.00 93.00
masses[18] 50.00 75.00 13.00
masses[19] 33.00 33.00 47.00
最后,始终在编译时启用警告,并且不要接受代码,直到在没有警告的情况下干净地编译。要启用警告,请将 -Wall -Wextra
添加到 gcc
编译字符串中。 (添加 -pedantic
以获得几个额外的警告)。对于 VS(windoze 上的 cl.exe
),添加 /Wall
。对于 clang
,添加 -Weverything
。阅读并理解每个警告。他们将识别任何问题以及问题发生的确切线路。
关于c - 尝试将数据从文件存储到结构数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47426295/
说真的,你怎么能在不发疯的情况下处理所有这些异常呢?我是不是读了太多关于异常处理的文章或什么?我尝试重构了几次,但每次似乎都以更糟糕的结果告终。也许我应该承认确实会发生异常(exception)情况,
背景 两者 try/rescue和 try/catch是 Elixir 中的错误处理技术。根据 corresponding chapter在介绍指南中。 Errors can be rescued u
每当我尝试在 Raspberry PI 上运行此 python 脚本时,我都会遇到问题: import socket import sys # Create a TCP/IP socket sock
我想知道一些关于 PHP 的 try , catch声明。 让我们考虑以下示例。 abstract class ExceptionA extends Exception {} class Except
我的 laravel v5.4 项目中有两个模型,user 和 admin。 在 config/auth.php 中,我向守卫和提供者添加了管理员,如下所示: 'guards' => [ 'w
try: r = requests.get(url, params={'s': thing}) except requests.ConnectionError, e: print e
我有以下代码。 但是,它并不能捕获所有错误,而我仍然会收到“throw er;//未处理的'错误'事件”。 为什么是这样? app.post('/api/properties/zip/:zip/bed
问题与细节 我正在使用自定义错误处理,遇到的错误之一是“路径中的非法字符”。我有一个自定义函数,旨在通过路径字符串查找此类非法字符,并在找到它们时引发自定义错误。但是我发现,取决于非法字符,Test-
This question already has answers here: How do I catch a numpy warning like it's an exception (not j
我正在使用其他人的代码,但我不熟悉try/catch,因此我举了一个类似的小例子。在第11行上,如果我写了error(''),似乎没有发现错误并增加了索引j。但是,编写error(' ')或error
我在我的一个程序中遇到了这个问题,在这种情况下,尝试/异常(exception)的错误使程序变得更好,以防用户意外输入了他们不应该输入的内容。它仍然给我错误,我为为什么感到困惑。如果对我的问题确实很重
我在尝试TRY ... CATCH块时遇到问题。有人可以解释为什么以下代码无法执行我的sp吗? DECLARE @Result int SET @Result = 0 BEGIN TRY SE
我有一个相当大的 powershell 脚本,其中包含许多(20 多个)执行各种操作的函数。 现在所有代码实际上都没有任何错误处理或重试功能。如果某个特定的任务/功能失败,它就会失败并继续。 我想改进
为什么我尝试时需要导入 inputmismatchException catch(InputMismatchException e){ System.out.println("
我对此感到困惑 - 我为辅助方法编写了一个 try/catch 。它的目的是捕获任何无效输入(任何不是“男性”或“女性”的内容(没有特定情况)。如果输入无效,它将通知用户,然后让他们重试。如果有效,则
我有时会发现自己处于如下场景。尽可能简单地陈述问题 “有时我会创建一段代码,Java 让我将其包含在 try/catch 语句中。我没有使用 catch,所以我将其留空。为什么这是错误的?” boo
我有点困惑为什么当我不使用 Try block 时会出现 Try block 错误。 我在代码块底部附近收到错误通知。如果我不使用 try/catch,有人可以向我解释为什么会发生这种情况吗? 它是否
我已经盯着我的电脑两个小时了,我不知道我做错了什么。谁能帮助我看到光明? package blackjack; import java.util.Random; import java.util.Sc
我想将方法保存在 Enum 中,但 Class.getDeclaredMethod 抛出 NoSuchMethodException,那么我该如何处理呢?我的代码: public enum Car
这个问题已经有答案了: Executing multi-line statements in the one-line command-line (18 个回答) 已关闭 3 年前。 如何使用try.
我是一名优秀的程序员,十分优秀!