我遇到了一些文件IO问题。
我有这个文件:
db.dat:
Ryan
12 69.00 30.00 0.00
Bindy Lee
25 120.00 89.00 1.00
这是我的代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define RECORDS 30
#define LEN 20
main()
{
FILE *fptr;
fptr = fopen("db.dat", "r");
int i;
int counter = 2;
for (i = 0; i < counter; i++)
{
char temp1[LEN];
char temp2[LEN + 10];
fgets(temp1, LEN, fptr);
fgets(temp2, LEN, fptr);
printf("%s %s", temp1, temp2);
}
fclose(fptr);
}
我应该得到两条线,但我得到了这个:
Ryan
12 69.00 30.00 0.00
Bindy Lee
有人可以帮忙!我不知道为什么我没有得到两条线,为什么我得到空格。很奇怪......谢谢!!!!
答案 0 :(得分:2)
fgets
在读取LEN
个字符或到达行尾后停止。我认为你的问题是你LEN
太小了。
将printf更改为printf("temp1='%s'\ntemp2='%s'\n", temp1, temp2);
更详细的内容,您应该能够看到每个字符串中实际读取的内容。
答案 1 :(得分:1)
其他" "
:
变化:
printf("%s %s", temp1, temp2);
到
printf("%s%s", temp1, temp2);
由于字符串已包含'\n'
。
A newline character makes fgets stop reading, but it is considered a valid
character and therefore it is included in the string copied to str.
答案 2 :(得分:1)
你只读40个字节。如果你增加LEN,你可以阅读剩余的行,
或者不是按字节数读取,而是可以读取整行,直到有新行
#include <string.h>
#define RECORDS 30
#define LEN 20
main()
{
FILE *fptr;
fptr = fopen("b.db", "r");
int i;
int counter = 4;
for (i = 0; i < counter; i++)
{
char temp1[LEN];
fscanf(fptr, "%[^\n]%*c", temp1);
printf("%s\n", temp1);
}
fclose(fptr);
}
如果您有兴趣同时阅读姓名和相应的记录,可以调整类似的内容,
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define RECORDS 30
#define LEN 20
main()
{
FILE *fptr;
fptr = fopen("b.db", "r");
int i;
int counter = 2;
for (i = 0; i < counter; i++)
{
char temp1[LEN];
char temp2[RECORDS];
fscanf(fptr, "%[^\n]%*c%[^\n]%*c", temp1, temp2);
printf("%s ---- %s\n", temp1, temp2);
}
fclose(fptr);
}
答案 3 :(得分:1)
鉴于您正在进行结构化输入,您可以考虑使用scanf而不是fgets。我不清楚你说的是“我应该得到两条线”。
应该更好地适用于此的代码类似于:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define RECORDS 30
#define LEN 20
main()
{
FILE *fptr;
fptr = fopen("db.dat", "r");
int i;
int counter = 3;
for (i = 0; i < counter; i++)
{
char temp1[LEN];
char temp2[LEN + 10];
fgets(temp1, LEN, fptr);
fgets(temp2, LEN, fptr);
printf("%s%s", temp1, temp2);
}
fclose(fptr);
}
最重要的是你没有阅读最后一行,并且你不需要printf语句中“%s%s”之间的空格。 “%s%s”应该可以正常工作。
答案 4 :(得分:1)
我试试,调试;我发现问题就像missno所说的那样: “fgets在读取LEN字符后停止或者到达行尾。我认为你的问题是你让LEN太小了。”
第一次(count = 0),temp2没有得到'\ n'; 第二次(count = 0),temp1得到'\ n'; 这就是为什么,你可以试试并调试你的代码......