【问题标题】:File reading in C. Complications with fread functionC 中的文件读取。 fread 函数的并发症
【发布时间】:2014-03-19 05:44:03
【问题描述】:

我正在读取一个输入文件,但我在读取其中的每一行时遇到了麻烦。我的输入文件有两种类型的记录。一个有 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);
}

【问题讨论】:

  • 您需要在文件中添加记录长度。
  • 请贴出您看到的代码和错误
  • 我将代码调整为读取 927 个字符以同时处理这两个字符。但每次读取 52 个字符的记录时,它都会从旁边的记录中获取字符,直到满足 926 长度。
  • 我没有任何错误@MoMo。只是输出错误。
  • @entendezEJ 你打开两个文件输入读取和输出写入正确吗?但是你在哪里使用输出文件指针呢?

标签: c file-io fread


【解决方案1】:

从文件中读取行时,您应该使用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);    
}

【讨论】:

  • +1;但是你不应该看buffer[22],除非你知道你至少读了23个字符(这也是OP代码中的一个问题)。
  • 感谢@user3386109。 fgets 恰到好处。终于得到了我想要的输出。 :D
  • @pat 好点。我计算了长度,应该检查一下。
【解决方案2】:

如果每条记录都在单独的行中,则使用 fgets 函数,该函数将在遇到换行符时停止,例如:

 while(fgets(buf,LINESZ,ifp) != NULL)
 {
     //you can put your code here
 }

【讨论】:

  • 嗨@M Thotager。我修改了我的代码,是的,它有效!但是当我写入缓冲区时,它只写入第一条记录。但 printf 工作正常。你知道为什么吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-11
  • 2021-08-13
  • 2019-10-13
  • 1970-01-01
  • 2015-08-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多