文件IO麻烦

时间:2011-07-18 02:24:35

标签: c

我遇到了一些文件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

有人可以帮忙!我不知道为什么我没有得到两条线,为什么我得到空格。很奇怪......谢谢!!!!

5 个答案:

答案 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'

Reference

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'; 这就是为什么,你可以试试并调试你的代码......