c - 从 C 中的文本文件中读取逗号分隔的数字(坐标)
问题描述
我正在尝试从包含 1000 行数字的文本文件中读取 C 中的一些数字,例如:
-340,495,-153,-910,835,-947
-175,41,-421,-714,574,-645
-547,712,-352,579,951,-786
419,-864,-83,650,-399,171
...
但是当我执行代码时,我看到i
变量开始于901
而不是0
所以它从点读取数字i=901
到i=999
. 这是我遇到问题的地方。
我尝试使用while
循环而不是for
循环来避免额外的i
变量:
while(!feof(file_in)){
fscanf(file_in,"%d%*c%d%*c",&a[0],&a[1]);
fscanf(file_in,"%d%*c%d%*c",&b[0],&b[1]);
fscanf(file_in,"%d%*c%d%*c",&c[0],&c[1]);
printf("A(%d,%d) I=%d\n",a[0],a[1],i);
printf("B(%d,%d) I=%d\n",b[0],b[1],i);
printf("C(%d,%d) I=%d\n",c[0],c[1],i);
}
这是我很难处理的代码部分:
int main(void) {
FILE *file_in;
int a[2];
int b[2];
int c[2];
file_in = fopen("triangles.txt","r");
if (file_in == NULL){
printf("Can't open file for reading.\n");
exit(0);
}
else{
for(int i=0;i<1000; i++) {
fscanf(file_in,"%d%*c%d%*c",&a[0],&a[1]);
fscanf(file_in,"%d%*c%d%*c",&b[0],&b[1]);
fscanf(file_in,"%d%*c%d\n",&c[0],&c[1]);
printf("A(%d,%d) I=%d\n",a[0],a[1],i);
printf("B(%d,%d) I=%d\n",b[0],b[1],i);
printf("C(%d,%d) I=%d\n",c[0],c[1],i);
}
fclose(file_in);
}
return 0;
}
我的期望:
A(-340,495) I=0
B(-153,-910) I=0
C(835,-947) I=0
A(-175,41) I=1
...
我得到什么:
B(-225,-818) I=901
C(-808,-657) I=901
A(-279,-34) I=902
B(-533,-871) I=902
...
解决方案
我认为你还没有证明这个问题。这是对您的代码的小修改,向 报告错误stderr
,出现错误退出等等。
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int a[2];
int b[2];
int c[2];
const char filename[] = "triangles.txt";
FILE *file_in = fopen(filename, "r");
if (file_in == NULL)
{
fprintf(stderr, "Can't open file %s for reading.\n", filename);
exit(EXIT_FAILURE);
}
for (int i = 0; i < 1000; i++)
{
int r1 = fscanf(file_in, "%d%*c%d%*c", &a[0], &a[1]);
int r2 = fscanf(file_in, "%d%*c%d%*c", &b[0], &b[1]);
int r3 = fscanf(file_in, "%d%*c%d\n", &c[0], &c[1]);
if (r1 != 2 || r2 != 2 || r3 != 2)
{
fprintf(stderr, "Failed to read data for i = %d: r1 = %d, r2 = %d, r3 = %d\n",
i, r1, r2, r3);
exit(EXIT_FAILURE);
}
printf("A(%4d,%4d) I=%d\n", a[0], a[1], i);
printf("B(%4d,%4d) I=%d\n", b[0], b[1], i);
printf("C(%4d,%4d) I=%d\n", c[0], c[1], i);
}
fclose(file_in);
return 0;
}
请注意,它会仔细检查扫描操作,并在遇到问题时(何时?)报告问题。
注意格式字符串中的尾随换行符。当输入来自文件时,没关系(不是必需的,但没关系),但如果期望人类输入数字,这将是一场可怕的 UI 灾难。
给定数据文件:
-340,495,-153,-910,835,-947
-175,41,-421,-714,574,-645
-547,712,-352,579,951,-786
419,-864,-83,650,-399,171
我得到输出:
A(-340, 495) I=0
B(-153,-910) I=0
C( 835,-947) I=0
A(-175, 41) I=1
B(-421,-714) I=1
C( 574,-645) I=1
A(-547, 712) I=2
B(-352, 579) I=2
C( 951,-786) I=2
A( 419,-864) I=3
B( -83, 650) I=3
C(-399, 171) I=3
Failed to read data for i = 4: r1 = -1, r2 = -1, r3 = -1
当然,最后一行出现在标准错误上;其余的写在标准输出上。
因此,我认为您的问题不在显示的代码中。
推荐阅读
- c++ - 无法访问的代码如何导致我的程序崩溃?
- c# - 如何将热键添加到 CommonOpenFileDialog
- angular - 使用带有嵌套指令的 viewChildren 获取孩子
- python - 数组python中替换字符串的问题
- php - 重定向到来自 PHP 中 API 的 JSON 数组响应中返回的 url
- numpy - 使用 cython 加速数组合并计算
- rxjs - RxJS过滤和选择/取消选择复选框列表
- c++ - 如何在 Poco 中将工作 HTTP 代码转换为 HTTPS
- php - 如何让我的静态网站在 wamp 中公开
- javascript - 如何使用关键细节修改嵌套对象的属性