如何阻止fscanf在行尾时复制到数组中?

时间:2014-11-16 21:51:16

标签: c

我有一个像

这样的行的文件
Bob, 2,3,13,4
Jim 3,4,15,3
...

我试图将每行中的整数复制到我的数字数组中,这样我就能用它们做一些数学运算。

问题是,我事前并不知道这个人的名字后面会有多少个数字,但我知道它会少于100个。但是,当我运行我的代码时,它会复制2,3, 134进入我的数组,然后将一堆随机数分配到数组的其他插槽中。我该如何解决这个问题?

我希望它在看到回车后停止复制,我尝试通过像if(fgetc =!'\ r')这样的if语句来做到这一点,但它不起作用,也不能用于'\ n'。有人可以帮助我解决这个问题吗?

这是我的代码

#include <stdio.h>
#include <stdlib.h>

int main()
{
FILE *myFile;
myFile = fopen("bob.txt", "r");

//read file into array
int numberArray[100];
int i;

if (myFile == NULL)
{
printf("Error Reading File\n");
exit (0);
}

int k=0;
while(k==0){
if(fgetc(myFile)==',')
k=1;
} //brings pointer to the first number after the first comma
//still need a way to stop copying into array random numbers after the line is done
//so need it to stop after carriage return, but it doesn't work
//also need to start it again after for the next line

for (i = 0; i <100 ; i++)
{
fscanf(myFile, "%d,", &numberArray[i])
}

for (i = 0; i < 100 ; i++)
{
printf("Number is: %d\n\n", numberArray[i]);
}

fclose(myFile);

return 0;
}

3 个答案:

答案 0 :(得分:1)

fscanf将返回扫描的项目数量;在你的情况下,一旦它返回0,你知道你完成了那一行(因为它无法扫描一个整数)。

答案 1 :(得分:1)

尝试读取具有特殊行格式的文本的作业的错误工具。

尽管可能使用fscanf()执行此操作,但使用fgets()处理错误输入要容易得多。使用sscanf()"%n"(或strtol())来解析每一行。

在给出OP的2个例子中,看来逗号是可选的。

char name[40];
char buf[sizeof name + 100*22 + 2];
// read the entire line
if (fgets(buf, sizeof buf, myFile) == NULL) Handle_EOF();

int n;
char *p = buf;
// Get the name
if (sscanf(p, "%39[A-Za-z] %n", name, &n) != 1) Handle_NoName();
p += n;

// Get the integers
for (i=0; i<100; i++) {
  if (*p == ',') p++;
  if (sscanf(p, "%d %n", &numberArray[i], &n) != 1) break;
  p += n;
}

// Initialize remaining elements
for (; i<100; i++) {
  numberArray[i] = 0;
}

if (*p) Hanlde_ExtraTextAtEndOfLine();

// Use name and numberArray[] with i elements.

答案 2 :(得分:0)

int numberArray[100];
int i, ch, n;

while(1){
    while((ch=fgetc(myFile))!=EOF && ch != ',')
        ;//skip name and ','
    if(ch == EOF)
        break;
    //check of the end of the line is not necessary if name do not begin with a digit.
    for (i = 0; i < 100 && 1==fscanf(myFile, "%d,", &numberArray[i]); i++)
        ;

    n = i;
    for (i = 0; i < n ; i++){
        printf("Number is: %d\n", numberArray[i]);
    }
}