Чтение нескольких строк в C - PullRequest
0 голосов
/ 14 февраля 2019

Итак, я пытаюсь прочитать ввод из текстового файла и напечатать ту же самую вещь, которую я прочитал в C. Итак, ниже приведен ввод с последующим вводом:

ввод: Hi
вывод: Hi

#include <stdio.h>
#include <stdlib.h>

char *inputString(FILE *fp, size_t size) {
    //The size is extended by the input with the value of the provisional
    char *str;
    int ch;
    size_t len = 0;
    str = realloc(NULL, sizeof(char) * size); //size is start size
    if (!str)
        return str;
    while (EOF != (ch = fgetc(fp)) && ch != '\n') {
        str[len++] = ch;
        if (len == size) {
            str = realloc(str, sizeof(char) * (size += 16));
            if (!str)
                return str;
        }
    }
    str[len++] = '\0';

    return realloc(str, sizeof(char) * len);
}

int main(void) {
    char *m;

    // printf("input string : ");
    m = inputString(stdin, 10);
    printf("%s\n", m);

    free(m);
    return 0;
}

Для этого ввода:

    Hi, this is the first line 
    This is the second line
    This is the third line \n

Это вывод, который я ожидал:

    Hi, this is the first line 
    This is the second line
    This is the third line \n

Вот что я получил:

    Hi, this is the first line 

Имеет смысл, что код печатает только первую строку, но так как условие в охране больше не будет истинным после нажатия новой строки, но я не знаю, как структурировать свой код такон читает построчно и печатает их соответственно.

Ответы [ 4 ]

0 голосов
/ 15 февраля 2019

Все, что вам нужно, это повторить процесс, пока вы можете прочитать строки:

int main(void) {
    char *m;

    // printf("input strings: ");
    while ((m = inputString(stdin, 10)) != NULL) {
        printf("%s\n", m);
        free(m);
    }
    return 0;
}

Чтобы это работало правильно, вы должны вернуть NULL в конце файла:

#include <stdio.h>
#include <stdlib.h>

char *inputString(FILE *fp, size_t size) {
    //The size is extended by the input with the value of the provisional
    int ch;
    size_t len = 0;
    char *str = malloc(size);

    if (str == NULL)
        return NULL;

    while ((ch = fgetc(fp)) != EOF && c != '\n') {
        if (len + 2 > size) {
            char *new_str = realloc(str, size += 16);
            if (!new_str) {
                free(str);
                return NULL;
            str = new_str;
        }
        str[len++] = ch;
    }
    if (c == EOF && len == 0) {
        /* at end of file */
        free(str);
        return NULL;
    }
    str[len++] = '\0';
    return realloc(str, len);
}
0 голосов
/ 14 февраля 2019

Вместо:

while(EOF!=(ch=fgetc(fp))&& ch != '\n' ){
    // stuff
}

вы можете сделать:

while(EOF!=(ch=fgetc(fp))){
    // stuff
    if (ch == '\n') break;
}

Теперь вы использовали новую строку.

0 голосов
/ 14 февраля 2019

Попробуйте,

#include<stdio.h>

void main(int argc, char **argv)
{
        int cnt=0;
        char buf[1024];
        FILE *fptr=stdin;
        printf("Input: \n");
        char ch=fgetc(fptr);
        buf[cnt++]=ch;
        while(ch!='$')
        {
                buf[cnt++]=ch;
                ch=fgetc(fptr);
        }
        buf[cnt++]='$';
        buf[cnt]='\0';
        printf("Output:\n");
        fputs(buf,stdout);
        fclose(fptr);

}

Я поставил '$' в качестве разделителя.Я использовал дополнительный буфер, так как символ новой строки связан с EOF для стандартного ввода.Поэтому, если я немедленно распечатаю символ, он выходит из цикла.

0 голосов
/ 14 февраля 2019

Если вы хотите, чтобы код читал каждую строку, удалите && ch != '\n' из условия цикла while.

Кроме того, код читает из стандартного ввода вместо файла.Используйте fopen для чтения из файла, т.е. m = inputString(fopen("filename.txt", "r"), 512).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...