【问题标题】:fprintf saves wrong data to filefprintf 将错误的数据保存到文件中
【发布时间】:2016-03-06 16:13:49
【问题描述】:

我有一个输入文件a.txt:

1 abc 3
2 efgh 4.5
3 text 3
4 xyz 2

所以基本上,它有 3 列,第一列是 int,第二列是 text,第三列是 double。我需要逐行读取这个文件(我猜这确实有效),但是在将第二列和第三列写入另一个 (b.txt) 文件时遇到了一些问题。 fprinft 保存如下内容:

 0.000000
 0.000000
 0.000000
 0.000000
xvæ$ 0.000000

而不是

abc 3
efgh 4.5
text 3
xyz 2

我只需要将a.txt 文件中的第二列和第三列保存到b.txt 文件中。这是我的代码:

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

typedef struct mypair
{
    char string[1024];
    double number;
} mypair;

void zero_string(char *string, int n)
{
    int i;
    for(i=0; i<n; i++)
        string[i] = '\0';
}

int row(FILE* f, struct mypair *p)
{
    int num;

    if(!feof(f))
    {
        if(fscanf(f,"%d %s %lf", &num, p->string, &p->number) == 3)
        {
            return 0;
        }
    }
    else
    {
        return 1;
    }
}

int main(int argc, char **argv)
{
    int n = 5, status = 0, i = 0, j;

    struct mypair array[5];
    char file_in_name[255];
    char file_out_name[255];

    FILE *fin;
    FILE *fout;

    zero_string(file_in_name, 255);
    zero_string(file_out_name, 255);

    printf("Data file:\n> ");
    scanf("%s", file_in_name);
    printf("Out file:\n> ");
    scanf("%s", file_out_name);

    fin = fopen(file_in_name, "r");
    fout = fopen(file_out_name, "w");

    if( fin == NULL )
    {
        exit(-1);
    }
    if( fout == NULL )
    {
        exit(-1);
    }

    while(status != 1)
    {
        status = row(fin, &array[i]);
        i ++;

        fprintf(fout, "%s %lf\n", array[i].string, array[i].number);

        if(i >= n)
            break;
    }

    fclose(fin);
    fclose(fout);

    for(j=0; j<i; j++)
        printf("%s %lf\n", array[i].string, array[i].number);

    return 0;
}

我修改了代码,现在可以了,谢谢!

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

typedef struct mypair
{
    char string[1024];
    double number;
} mypair;

void zero_string(char *string, int n)
{
    int i;
    for(i=0; i<n; i++)
        string[i] = '\0';
}

int row(FILE* f, struct mypair *p)
{
    int num;

    if(!feof(f))
    {
        if(fscanf(f,"%d %s %lf", &num, p->string, &p->number) == 3)
        {
            return 0;
        }
    }
    else
    {
        return 1;
    }
}

int main(int argc, char **argv)
{
    int n = 5, status = 0, i = 0, j;

    struct mypair array[5];
    char file_in_name[255];
    char file_out_name[255];

    FILE *fin;
    FILE *fout;

    zero_string(file_in_name, 255);
    zero_string(file_out_name, 255);

    printf("Data file:\n> ");
    scanf("%s", file_in_name);
    printf("Out file:\n> ");
    scanf("%s", file_out_name);

    fin = fopen(file_in_name, "r");
    fout = fopen(file_out_name, "w");

    if( fin == NULL )
    {
        exit(-1);
    }
    if( fout == NULL )
    {
        exit(-1);
    }

    printf("\n");

    while(status != 1)
    {
        status = row(fin, &array[i]);

        if(i >= n)
            break;
        else
        {
            if(status != -1)
                fprintf(fout, "%s %lf\n", array[i].string, array[i].number);
        }

        i ++;
    }

    fclose(fin);
    fclose(fout);

    for(j=0; j<i; j++)
        printf("%s %lf\n", array[j].string, array[j].number);

    return 0;
}

【问题讨论】:

  • 请阅读Why is “while ( !feof (file) )” always wrong?。你没有使用完全相同的结构,但你有同样的问题。
  • 您的row 函数并不总是返回值。当fscanf() 失败时,您不会返回任何内容,因此会返回随机乱码。您的代码不会保护自己免受行数超过其存储空间的文件的影响。这会导致问题。始终确保您不会访问超出数组范围的内存。

标签: c printf scanf


【解决方案1】:

在你的底部循环中,你想用 j 来索引你的数组,而不是 i。

【讨论】:

  • 谢谢!我不知道我怎么可能没有注意到它!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-18
  • 2011-05-17
  • 1970-01-01
  • 2014-07-02
  • 1970-01-01
相关资源
最近更新 更多