我有一个像
这样的行的文件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;
}
答案 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]);
}
}