gpt4 book ai didi

c - 在C中逐行读取每个字符

转载 作者:行者123 更新时间:2023-11-30 17:16:19 25 4
gpt4 key购买 nike

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

#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;
}

这是这里的某人写的,但我无法回复,因为我需要更多积分,哈哈。我不明白的部分是:

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

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

buffer[pos] = 0;

我阅读代码的方式是:声明包含每行每个字符的缓冲区的大小(我的意思是,缓冲区在最后被释放,因此它保留了每一行的信息,对吧?),然后声明其他变量并分配该缓冲区的内存缓冲。打开文件 myfile.txt,如果不为空,则使 pos = 0,然后使“c”存储文件的第一个字符(现在函数指向下一个字符),然后如果 c != EOF 表示未到达文件末尾,将字符“c”保存在缓冲区的位置1中(我在这里感到困惑,为什么是1而不是0)。然后,如果需要的话,重新分配两倍于以前的内存。对行中的每个字符执行此操作,直到到达 EOF 或\n。现在让 buffer[pos] = 0,我不知道“pos”有什么值,我假设他让 buffer[pos] = 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;
}

关于c - 在C中逐行读取每个字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29688400/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com