Reading multiple lines in C using fscanf
我目前正在做一个uni项目,该项目必须读取以.txt格式给出的多行输入序列。 这是我第一次使用C,因此我对使用fscanf读取文件然后进行处理并不了解。 我写的代码是这样的:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| #include <stdio.h>
#include <stdlib.h>
int main () {
char tipo [1];
float n1 , n2 , n3 , n4 ;
int i ;
FILE *stream ;
stream =fopen("init.txt","r");
if ((stream =fopen("init.txt","r"))==NULL ) {
printf("Error");
} else {
i =0;
while (i <4) {
i ++;
//i know i could use a for instead of a while
fscanf(stream ,"%s %f %f %f %f%", &tipo , &n1 , &n2 , &n3 , &n4 );
printf("%s %f %f %f %f", tipo , n1 , n2 , n3 , n4 );
}
}
return 0;
} |
我的" init"文件的格式如下:
1 2 3 4 5 6
| L 150.50 165.18 182.16 200.50
G 768.12 876.27 976.56 958.12
A 1250.15 1252.55 1260.60 1265.15
L 200.50 245.30 260.10 275.00
A 1450.15 1523.54 1245.17 1278.23
G 958.12 1000.65 1040.78 1068.12 |
我不知道如何在读取第一个后告诉程序跳过一行。
我在这里先向您的帮助表示感谢!
-
在两个方面,将&tipo的值作为第一个参数传递是不好的:您传递一个指向1个char数组的指针,但是%s期望一个指向char的指针指向一个缓冲区的第一个char,该指针具有足够的空间来读取字符串 非空白字符。 C中的字符串以空值结尾,因此在这种情况下,将写入2个字符,但数组中的空间为1。
-
我认为您的代码不起作用。 说明如何。
-
通常,避免使用scanf或fscanf。 众所周知,它们很难使用。 用fgets一次读取每一行,然后可以在每个结果字符串上使用sscanf。
-
如果我错了请纠正我。 L 150.50 165.18 182.16 200.50 A 1250.15 1252.55 1260.60 1265.15 A 1450.15 1523.54 1245.17 1278.23
-
我认为fscanf很难使用。 这很容易。 不要使用它。
响应"我不知道如何在读取第一个代码后告诉程序跳过一行。"请执行此操作!
1 2 3 4 5 6 7 8 9
| while (i <4)
{
i ++;
//i know i could use a for instead of a while
fscanf(stream ,"%s %f %f %f %f%", &tipo , &n1 , &n2 , &n3 , &n4 );
if(i != 2) //skipping second line
printf("%s %f %f %f %f", tipo , n1 , n2 , n3 , n4 );
} |
同样,使用1元素数组毫无意义。 如果您只想使用char元素,请将其从char tipo [1];更改为char tipo;,并将您各自的"%s"更改为"%c"。 但是,如果您希望它是string元素:请将其从char tipo [1];更改为char *tipo;或char tipo [n];并保留您的"%s"。
使用fscanf(stream,"%*[^\
]\
")跳过行。 只需添加一个if语句来检查要跳过的行号。 if (i == 2)跳过第二行。
同时将char tipo[1]更改为char tipo,并将printf和fscanf中的"%s"更改为"%c"
1 2 3 4 5 6 7 8 9 10 11 12 13
| while (i ++ < 4)
{
if (i == 2) // checks line number. Skip 2-nd line
{
fscanf(stream ,"%*[^\
]\
");
}
fscanf(stream ,"%c %f %f %f %f\
", &tipo , &n1 , &n2 , &n3 , &n4 );
printf("%c %f %f %f %f\
", tipo , n1 , n2 , n3 , n4 );
} |
另外,您要打开文件两次。 if(streem = fopen("init.txt","r") == NULL)将为true,因为您已经打开了文件。
-
非常感谢您的帮助,尤其是使用fopen == null时。 由于我是新手,所以我不知道
-
只需删除stream = fopen(" init.txt"," r"),因为您要打开文件两次。 您不需要它。
当您只打算读取一个字符时,没有理由使用char数组(字符串)。
做这个:
和
1
| fscanf(stream ,"%c %f %f %f %f%", &tipo , &n1 , &n2 , &n3 , &n4 ); |
并且您的代码应该可以工作。 注意c而不是s。