FILE IO Проблема - PullRequest
       1

FILE IO Проблема

1 голос
/ 18 июля 2011

У меня проблемы с некоторыми файлами ввода-вывода.

У меня есть этот файл:

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 ]

2 голосов
/ 18 июля 2011

fgets останавливается после чтения LEN символов ИЛИ достигает конца строки.Я думаю, что ваша проблема здесь в том, что вы сделали LEN слишком маленьким.

Измените ваш printf на что-то более подробное, например printf("temp1='%s'\ntemp2='%s'\n", temp1, temp2);, и вы сможете увидеть, что на самом деле читалось в каждой строке.

1 голос
/ 18 июля 2011

У меня есть попытка и отладка;Я нахожу проблему так же, как и то, что пропущено: «fgets останавливается после того, как он читает символы LEN ИЛИ достигает конца строки. Я думаю, что ваша проблема здесь в том, что вы сделали LEN слишком маленьким.»

в первый раз (count = 0), temp2 не получает '\ n';во второй раз (count = 0), temp1 получить '\ n';вот почему вы можете попробовать и отладить свой код .....

1 голос
/ 18 июля 2011

Учитывая, что вы используете структурированный ввод, вы можете рассмотреть использование 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);
}

Самое главное, что вы не читали последнюю строку, и вам не нужно было пробела между "% s% s" в операторе printf."% s% s" должно работать нормально.

1 голос
/ 18 июля 2011

Вы читаете только 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);      
}
1 голос
/ 18 июля 2011

Для дополнительных " ":

изменение:

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.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...