从格式化的流I / O更改为c中的直接I / O.

时间:2015-03-16 18:54:58

标签: c io

我希望能够更改此代码以使用直接I / O写出文件,而不是格式化流I / O?但是我不确定如何做到这一点,非常感谢帮助。

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

#define MAX 100
#define FORMATREAD "%12s %100s %100s"

int main(void) 
{
    FILE *in_ptr, *out_ptr;
    char fname[MAX], lname[MAX], number [12];

    in_ptr  = fopen("phonelist.txt", "r");
    out_ptr = fopen("history.txt", "w+");

    if ((NULL == in_ptr) || (NULL == out_ptr)) 
    {
        fputs("Problem opening files , exiting!", stderr);
        exit(1);
    }

    if (3 = fscanf(in_ptr , FORMATREAD , number , fname ,lname)) 
    {
        fprintf(out_ptr , "%s %s %s\n", number , fname , lname);
        printf("%s %s %s\n", number , fname , lname);
        printf("The phone book has format: phone number name\n");
    }
    else 
    {
        fprintf(*out_ptr , "Unknown type\n");
        printf("The phone book has unknown format\n");
    }
    fclose(in_ptr);
    fclose(*out_ptr);

    return 0;
}

我很擅长编码,如果有任何明显的错误,请对不起。

1 个答案:

答案 0 :(得分:0)

要不使用fprintf()之类的格式化输出,请使用sprintf()或其他各种方法在内存中构造字符串并编写。确保buffer足够大是重要的。

// fprintf(out_ptr , "%s %s %s\n", number , fname , lname);

// slightly oversize buffer, but it scales as the %s format and variables do.    
char buffer[sizeof number + sizeof fname + sizeof lname + sizeof FORMATREAD];
sprintf(buffer, "%s %s %s\n", number , fname , lname);
fputs(buffer, out_ptr);

存在关于fscanf(in_ptr , FORMATREAD , number , fname ,lname)暗示格式化数据的担忧。 FORMATREAD 检测'\n'' '不同。建议使用fgets()读取数据行,然后解析它。


代码还需要纠正缓冲区大小和输入格式

#define MAX 100
#define FORMATREAD "%12s %100s %100s"
...
char fname[MAX+1], lname[MAX+1], number[12+1];

好的代码是检查输入函数的retrun值,但需要使用==而不是= @Weather Vane

// if (3 = fscanf(in_ptr , FORMATREAD , number , fname ,lname)) 
if (3 == fscanf(in_ptr , FORMATREAD , number , fname ,lname))