在C中逐行读取每个char

时间:2015-04-17 00:51:13

标签: c

我正在寻找一个关于如何从txt文件中的每行读取char的解决方案,我找到了一个,但我没有得到代码的某些部分。就是这样:

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

void handle_line(char *line) {
  printf("%s", line);
}

int main(int argc, char *argv[]) {
    int size = 1024, pos;
    int c;
    char *buffer = (char *)malloc(size);

    FILE *f = fopen("myfile.txt", "r");
    if(f) {
      do { // read all lines in file
        pos = 0;
        do{ // read one line
          c = fgetc(f);
          if(c != EOF) buffer[pos++] = (char)c;
          if(pos >= size - 1) { // increase buffer length - leave room for 0
            size *=2;
            buffer = (char*)realloc(buffer, size);
          }
        }while(c != EOF && c != '\n');
        buffer[pos] = 0;
        // line is now in buffer
        handle_line(buffer);
      } while(c != EOF); 
      fclose(f);           
    }
    free(buffer);
    return 0;
}

这是由来自这里的人写的,但是我不能回复'因为我需要更多的点lol。我不明白的部分是:

if(c != EOF) buffer[pos++] = (char)c;

缓冲区[pos ++]有什么作用?它实际上增加了变量“pos”吗?另外,为什么从1开始而不是0? (pos从0开始)。 我无法真正跟踪变量“pos”,我不知道为什么缓冲区[pos]为0:

buffer[pos] = 0;

我阅读代码的方式是: 声明包含每一行中每个字符的缓冲区的大小(我的意思是,缓冲区在结尾处是空闲的,所以它保持每一行的信息都正确吗?),然后声明其他变量并分配其中的内存缓冲。 打开文件myfile.txt,如果它不是null,则使pos = 0,然后使“c”存储文件的第一个字符(现在函数指向下一个字符),然后如果c!= EOF意味着没有到达文件的结尾,将字符“c”保存在缓冲区的位置1(我在这里感到困惑,为什么1而不是0)。然后根据需要重新分配两次内存。对于你到达EOF或\ n的行中的每个字符都这样做。现在使缓冲区[pos] = 0,我不知道“pos”有什么值,我假设他使缓冲区[pos] = 0来表示该行的结束? IDK的。打印该行,直到您到达文件末尾。关闭文件,释放缓冲区中的内存。

帮助!感谢。

1 个答案:

答案 0 :(得分:0)

fgetc(fp) - 从指定的输入流(fp)读取下一个字符, 推进关联的文件位置指示符 (你不需要)。如果成功,该函数将返回字符读取;否则,返回值EOF(-1)。

这是一个非常简单的简单示例,使用fgetc()读取文件的每个字符(并使用fputc()将其写入另一个文件)

char filename1[]={"c:\\play\\_in.txt"};//change paths as needed
char filename2[]={"c:\\play\\_out.txt"};

int main(void)
{
    FILE *fp1 = {0};
    FILE *fp2 = {0};
    int c=0;

    fp1 = fopen(filename1, "r");
    if(fp1)
    {
        fp2 = fopen (filename2, "w");
        if(fp2)
        {
            c = fgetc(fp1);
            while(c != EOF)
            {
                fputc(c, fp2);
                c = fgetc(fp1);
            }
            fclose(fp2);            
        }
        fclose(fp1);
    }

    return 0;
}