c - C 中的文件读取。 fread 函数的并发症

标签 c file-io fread

我正在读取一个输入文件,但在读取其中的每一行时遇到了麻烦。我的输入文件有两种类型的记录。一个有 52 个字符,而另一个有 926 个字符。我不知道如何处理我的 fread 函数,以便它可以处理这两个记录。谁能帮我吗?谢谢

#define LINESZ 927     /* one extra byte for new line */
int num;               /* integer for line number */
char buffer[LINESZ];   /* buffer for file read line */

int main()
{
    FILE *ifp, *ofp;

    ifp = fopen("dd:INPUTF", "r");
    ofp = fopen("dd:OUTPUTF", "w");

    while (!feof(ifp)) {
        if (num = (fread(buffer, sizeof(char), LINESZ, ifp))) {
            if (buffer[22] == 'O') {
                printf("ravroot, %c\n", buffer[22]);
                printf("%s*\n", buffer);
            }
            else if (buffer[22] == 'A') {
                printf("ravrate, %c\n", buffer[22]);
                printf("%s*\n", buffer);
            }
        }
    }

    fclose(ifp);
    fclose(ofp);
    return(0);
}

最佳答案

从文件中读取行时,您应该使用fgets 函数。但是请注意,fgets 会将换行符写入您的缓冲区,因此您需要删除换行符。生成的代码如下所示

#define LINESZ 1024    /* lots of extra bytes, memory is cheap */
char buffer[LINESZ];   /* buffer for file read line */

int main( void )
{
    int length;
    FILE *ifp, *ofp;

    ifp = fopen("dd:INPUTF", "r");
    ofp = fopen("dd:OUTPUTF","w");

    while( fgets( buffer, LINESZ, ifp ) != NULL )
    {
        // remove the newline character, if any
        length = strlen( buffer );
        if ( length > 0 && buffer[length-1] == '\n' )
            buffer[--length] = '\0';                    

        if ( length > 22 )
        {
            if(buffer[22] == 'O')
            {
                printf("ravroot, %c\n", buffer[22]);
                printf("%s*\n", buffer);
            }
            else if(buffer[22] == 'A')
            {
                printf("ravrate, %c\n", buffer[22]);
                printf("%s*\n", buffer);
            }
        }
    }
    fclose(ifp);
    fclose(ofp);
    return(0);    
}

关于c - C 中的文件读取。 fread 函数的并发症,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22497250/

相关文章:

c - 运行时错误 LeetCode — 338. 计算 c 中的位数

c++ - 如何将可变数量的参数传递给 printf/sprintf

c++ - 如何在C++中按字节写入文件

c# - 如何减少写入磁盘的旧应用程序和实时读取它的应用程序 (.NET) 上的文件 IO

使用一种功能复制文本和二进制文件?

c - strtok() 在 C 中给出段错误

c - Unix: "ls -l"在哪里获取设备大小字段中的逗号分隔值?

C、检测fread是否会阻塞

c - 为什么这个缓冲区指向不可寻址的字节?

java - I/O 概念刷新与同步