Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何从文件中读取数字并将其平均值保存到同一文件中?_C_File_Fopen - Fatal编程技术网

C 如何从文件中读取数字并将其平均值保存到同一文件中?

C 如何从文件中读取数字并将其平均值保存到同一文件中?,c,file,fopen,C,File,Fopen,我有一个包含两列的txt文件: 1 2 3 4 5 6 7 8 我想阅读这些数字,计算平均值,并将结果保存到同一文件的第三列。我打开了我的文件进行更新“r+”,但它似乎不起作用。阅读是可以的,但是当我添加第三列时,文件发生了错误。。。似乎它被重写了,当我在第一个循环指令后调用我的fun-时,里面没有原始内容。有什么想法吗 #include <stdio.h> #include <stdlib.h> void fun(const char *filename) {

我有一个包含两列的txt文件:

1 2
3 4
5 6
7 8
我想阅读这些数字,计算平均值,并将结果保存到同一文件的第三列。我打开了我的文件进行更新
“r+”
,但它似乎不起作用。阅读是可以的,但是当我添加第三列时,文件发生了错误。。。似乎它被重写了,当我在第一个循环指令后调用我的
fun
-时,里面没有原始内容。有什么想法吗

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

void fun(const char *filename)
{
    double num1 = 0, num2 = 0, num3 = 0;
    FILE *f;
    if((f = fopen(filename, "r+")) == NULL)
    {
        exit(-1);
    }

    while(fscanf(f, "%lf %lf", &num1, &num2) != EOF)
    {
        //printf("num1 = %.2f, num2 = %.2f\n", num1, num2);
        num3 = num1 + num2;
        fprintf(f, "%lf %lf %lf\n", num1, num2, num3/2.0);
    }

    fclose(f);
}

int main(int argc, char **argv)
{
    fun("numbers.txt");

    return 0;
}
也尝试了这个,但我的程序挂起了:

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

void fun(const char *filename)
{
    double num1 = 0, num2 = 0, num3 = 0;\

    FILE *f;
    if((f = fopen(filename, "r+")) == NULL)
    {
        exit(-1);
    }

    int write_at = 0, read_at = 0;

    while(fscanf(f, "%lf %lf", &num1, &num2) != EOF)
    {
        read_at = ftell(f);
        fseek(f, write_at, SEEK_SET);
        num3 = num1 + num2;
        fprintf(f, "%lf %lf %lf\n", num1, num2, num3/2.0);
        write_at = ftell(f);
        fseek(f, read_at, SEEK_SET);
    }

    fclose(f);
}

int main(int argc, char **argv)
{
    fun("numbers.txt");
    return 0;
 }
#包括
#包括
void fun(常量字符*文件名)
{
双num1=0,num2=0,num3=0\
文件*f;
如果((f=fopen(文件名,“r+”)==NULL)
{
出口(-1);
}
int write_at=0,read_at=0;
而(fscanf(f,%lf%lf,&num1和num2)!=EOF)
{
read_at=ftell(f);
fseek(f,write_at,SEEK_SET);
num3=num1+num2;
fprintf(f,“%lf%lf%lf\n”,num1,num2,num3/2.0);
写入=ftell(f);
fseek(f,read_at,SEEK_SET);
}
fclose(f);
}
int main(int argc,字符**argv)
{
乐趣(“numbers.txt”);
返回0;
}

打开一个临时文件并将结果保存在那里。在成功读取整个“numbers.txt”并写入临时文件后,删除原始文件并重命名临时文件

对于文件处理,这有一个很好的优点,即如果处理以某种方式失败(IO错误、数据格式错误等),那么原始文件仍然完好无损。这在编辑中很常见


另一种方法是将“新”文件存储在内存中,并在最后将其写出来。

“发生了错误”不是一个有用的描述……似乎您正在同时读取和写入文件[i]。为什么不先读取数据,存储数据,然后最后写入数据呢?可能发生的情况是,您正在覆盖文件的一部分(您不能像这样在一行中添加字符,文件只是低级的原始二进制数据)。将文件读入数组,计算平均值,然后将行写回文件。@H2CO3:我的第二个解决方案如何-你能帮忙吗,为什么它不起作用?@BrianBrown出于同样的原因它不起作用。
#include <stdio.h>
#include <stdlib.h>

void fun(const char *filename)
{
    double num1 = 0, num2 = 0, num3 = 0;\

    FILE *f;
    if((f = fopen(filename, "r+")) == NULL)
    {
        exit(-1);
    }

    int write_at = 0, read_at = 0;

    while(fscanf(f, "%lf %lf", &num1, &num2) != EOF)
    {
        read_at = ftell(f);
        fseek(f, write_at, SEEK_SET);
        num3 = num1 + num2;
        fprintf(f, "%lf %lf %lf\n", num1, num2, num3/2.0);
        write_at = ftell(f);
        fseek(f, read_at, SEEK_SET);
    }

    fclose(f);
}

int main(int argc, char **argv)
{
    fun("numbers.txt");
    return 0;
 }