0

こんにちは皆さん、私はこの問題の解決策を見つけようとしている 2 番目の週末にいます。私はCプログラミングが初めてで、テキストファイルの個々の行を読み取り、それぞれを独自の変数に渡して、それらを操作できるようにしようとしています(比較、計算など)。

個々の行を読み取るコードがありますが、各行を変数に渡す方法がわかりません。コードは次のとおりです。

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

struct line_reader {
FILE    *f;
char    *buf;
size_t   siz;
};


void
lr_init(struct line_reader *lr, FILE *f)
{
lr->f = f;
lr->buf = NULL;
lr->siz = 0;
}

char *
next_line(struct line_reader *lr, size_t *len)
{
size_t newsiz;
int c;
char *newbuf;

*len = 0;
for (;;) {
    c = fgetc(lr->f);
    if (ferror(lr->f))
        return NULL;

    if (c == EOF) {

        if (*len == 0)
            return NULL;
        else
            return lr->buf;
    } else {

        if (*len == lr->siz) {

            newsiz = lr->siz + 4096;
            newbuf = realloc(lr->buf, newsiz);
            if (newbuf == NULL)
                return NULL;
            lr->buf = newbuf;
            lr->siz = newsiz;
        }
        lr->buf[(*len)++] = c;


        if (c == '\n')
            return lr->buf;
         }
         }
         }


void
lr_free(struct line_reader *lr)
{
free(lr->buf);
lr->buf = NULL;
lr->siz = 0;

}

int
main()
{
struct line_reader lr;
FILE *f;
size_t len;
char *line;

f = fopen("file.txt", "r");
if (f == NULL) {
    perror("foobar.txt");
    exit(1);
}


lr_init(&lr, f);
while (line = next_line(&lr, &len)) {

    fputs("1: ", stdout);
    fwrite(line, len, 1, stdout);
}
if (!feof(f)) {
    perror("next_line");
    exit(1);
}
lr_free(&lr);

return 0;

}

どんな助けでも大歓迎です。

4

2 に答える 2

0

単に提案として配列を使用するのはどうですか

例えば)

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

char** readFile(const char *filename, size_t *lineCount){
    FILE *fp;
    char buff[4096];
    size_t lines = 0, capacity=1024;
    char **line;

    if(NULL==(fp=fopen(filename, "r"))){
        perror("file can't open.");
        return NULL;
    }
    if(NULL==(line=(char**)malloc(sizeof(char*)*capacity))){
        perror("can't memory allocate.");
        fclose(fp);
        return NULL;
    }
    while(NULL!=fgets(buff, sizeof(buff), fp)){
        line[lines++] = strdup(buff);
        if(lines == capacity){
            capacity += 32;
            if(NULL==(line=(char**)realloc(line, sizeof(char*)*capacity))){
                perror("can't memory allocate.");
                fclose(fp);
                return NULL;
            }
        }
    }
    *lineCount = lines;
    fclose(fp);

    return (char**)realloc(line, sizeof(char*)*lines);
}
void freeMem(char** p, size_t size){
    size_t i;

    if(p==NULL) return;

    for(i=0;i<size;++i)
        free(p[i]);
    free(p);
}

int main(){
    size_t lines;
    char **line;

    if(NULL!=(line=readFile("file.txt", &lines))){//lines: set line count of file
        printf("%s", line[25]);// 26th line of file, zero origin
    }
    freeMem(line, lines);
    return 0;
}
于 2013-04-13T14:06:33.177 に答える
0

POSIX準拠のシステムでは、mスキャン修飾子を使用するだけです:

for ( char *line, nl; scanf("%m[^\n]%c",&line,&nl) != EOF ; free(line) ) {
    if ( !line )
        strcpy(line=malloc(1),""), getchar();
    // ...
}

mは 5 年前から標準になっています。

于 2013-04-13T16:44:49.470 に答える