用C语言从文本文件中读取逗号分隔的数字(坐标)
我试图从一个包含1000行数字的文本文件中读取C中的一些数字,例如:用C语言从文本文件中读取逗号分隔的数字(坐标),c,file,C,File,我试图从一个包含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变量:
-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(文件在“%d%*c%d%*c”、&a[0]、&a[1]中);
fscanf(文件在“%d%*c%d%*c”、&b[0]、&b[1]中);
fscanf(文件在“%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);
}
这是我很难处理的代码部分:
A(-340,495) I=0
B(-153,-910) I=0
C(835,-947) I=0
A(-175,41) I=1
...
int main(无效){
文件*FILE_in;
int a[2];
int b[2];
int c[2];
文件_in=fopen(“triangles.txt”、“r”);
if(file_in==NULL){
printf(“无法打开文件进行读取。\n”);
出口(0);
}
否则{
对于(int i=0;i我认为您尚未演示该问题。这是对代码的轻微修改,向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;
}
我得到输出:
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
当然,最后一行出现在标准错误上;其余的写在标准输出上
因此,我认为您的问题不在显示的代码中。请注意。请注意,如果无法打开该文件,您将尝试使用空指针调用fclose()
。这不会带来快乐。只有在成功打开文件后才关闭该文件。通常,最好“快速失败”-报告错误(在stderr
上,而不是stdout
)并退出,剩下的代码缩进少一级。您提供的内容非常接近MCVE(),但我认为您应该省略对consistorigin()的调用
因为您没有提供该代码。如果忽略该调用时发现程序正常工作,则表明显示的位置错误。您还应该检查对fscanf()
的每次调用的返回值,以确保获得预期的值。目前,您不知道什么时候出错。正在移动fclose()
是主要的替代方案;这也是有效的。--您主要是测试的循环代码还是的while
循环代码?我不知道I
如何使用的循环得到错误的值,但是如果您没有真正使用I
的的while
循环,尤其是如果您忘记使用的话初始化它,那么您可能会看到901而不是0作为第一个值。不过,您似乎仍然在递增i
。您如何检查程序的输出?如果您只是将输出转储到控制台,则可能只是超出了控制台的回滚。请检查控制台应用程序的设置。我猜是file我尝试读取的文件太大,以至于溢出了一些内容,因为当我为一个相对较小的文件执行代码时,一切都正常。这是指向我尝试读取的文件的链接,我尝试了上述代码的改编(将每行输入的三行输出平坦化为每行输入的一行输出)在您的大数据文件上,它工作正常(除了三个数字是-1000
,这会使格式设置无效;%5d
而不是%4d
会恢复一致性)。
-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