C ++输入和输出文件

时间:2011-10-25 13:28:11

标签: c++

所以即时编写c ++程序,从输入文件中取一个整数,将其乘以2并将其输出到输出文件中。所以代码是 -

#include <stdio.h>
#include <iostream>
using namespace std;

int main() {
    int n;
    FILE * inFile;
    FILE * outFile;
    inFile = fopen ("reiz.in","r");
    outFile = fopen ("reiz.out","r+");
    fscanf (inFile, "%s", n);
    int m = n * 2;
    fprintf (outFile, "%n", n);
    fclose (inFile);
    fclose (outFile);
    return 0;
}

但是出了点问题。在reiz.in文件中有2号,运行程序后它应该在reiz.out中输出4,但它只显示不发送错误。我的剧本究竟出了什么问题? 最好的祝福, Y2oK

编辑1:好了,现在看起来像这样 -

#include <stdio.h>
#include <iostream>
using namespace std;

int main() {
    int n;
    FILE * inFile;
    FILE * outFile;
    inFile = fopen ("reiz.in","r");
    outFile = fopen ("reiz.out","r+");
    fscanf (inFile, "%d", &n);
    int m = n * 2;
    fprintf (outFile, "%d", m);
    fclose (inFile);
    fclose (outFile);
    return 0;
}

但是它仍然在运行reiz.exe文件时不会发送错误,并且它不会在输出文件上写任何内容 我现在有点困惑,不知道选择谁作为最佳答案,所以我会选择最“+1”的人。但是,感谢所有人!

6 个答案:

答案 0 :(得分:5)

这是一个C程序(除using namespace std;之外)。在C ++中,您应该使用流和格式化的I / O,如下所示:

#include <fstream>

int main() {
    std::ifstream input_file("reiz.in");
    int n;
    input_file >> n; // read one integer
    std::ostream output_file("reis.out");
    output_file << n * 2 << std::endl; // calculate n * 2 and write the result
                                       // to a file. std::endl adds a newline and
                                       // flushes the buffer
    return 0;
}

答案 1 :(得分:0)

n的地址传递给fscanf()(这是一个不是字符串的整数):

fscanf (inFile, "%d", &n);

所有这些东西都有点长,除非你实际上在写'C'。如果您正在编写'C ++'

,请查看iostream

答案 2 :(得分:0)

您的代码存在多个问题:

#include <stdio.h>

这是C include,而不是C ++ include。相反,你应该使用:

#include <cstdio>

fscanf (inFile, "%s", n);

格式%s适用于char*类型的字符串。您想要读取十进制数字,因此请改用%d。此外,您必须传递目的地的地址

fscanf (inFile, "%d", &n);

fprintf (outFile, "%n", n);

格式%n用于查询到目前为止写入的字节数,并且需要一个指针。由于您要写入十进制数字,请再次使用%d

fprintf (outFile, "%d", n);

答案 3 :(得分:0)

使用iostream(Bjorns回答)

但我认为

outFile = fopen ("reiz.out","r+");

应该是

outFile = fopen ("reiz.out","w+");

另外

fscanf (inFile, "%d", n);

应该是

fscanf (inFile, "%d", &n);

为便于参考,请使用完整的( C )程序:

#include <stdio.h>

int main() {
    int n;
    FILE * inFile;
    FILE * outFile;
    inFile = fopen ("reiz.in","r");
    outFile = fopen ("reiz.out","w+");
    fscanf (inFile, "%d", &n);
    int m = n * 2;
    fprintf (outFile, "%i", m);
    fclose (inFile);
    fclose (outFile);
    return 0;
}

答案 4 :(得分:0)

fscanf存在两个问题。首先,你的格式字符串是错误的 - 你正在取一个字符串,你应该在那里取一个(带符号?)小数。其次,您传递n按值,但您应该将指针传递给n

fscanf (inFile, "%d", &n);

您也是#include现已弃用的<stdio.h>文件。你应该:

#include <cstdio>

最后,你声明编写C ++代码,但实际编写的代码肯定不是C ++ - ish,也就是说它是类型不安全的。我建议你去C ++,或者不要 - 不要四处游荡。

这是一种更多的C ++方式来做你想做的事情(你应该添加错误检查并写入输出文件):

#include <cstdio>
#include <iostream>
#include <fstream>
using namespace std;

int main() {
    ifstream in("reiz.in", std::ios::in);
    int n = 0;
    in >> n;
    return 0;
}

答案 5 :(得分:0)

有几个问题会阻止您的代码正常运行。

  1. 无需将outfile作为r+打开。您可以使用模式w打开它。

    outFile = fopen ("reiz.out","w");
    
  2. 当您使用fscanf从文件中读取时,您将传递整数n而不是指向整数n的指针。 fscanf期望接收位置以写入它读取的整数。你正在传递整数本身(在最好的情况下,这将使你的程序崩溃。最坏的情况是,奇怪的东西将开始发生)。

    fscanf (inFile, "%s", &n);
    
  3. 在写入outfile时使用%n。这不会打印整数n,而是读取到目前为止写入的字节数。您想要使用%d

    fprintf (outFile, "%d", m);
    
  4. 另外,作为旁注,您似乎使用的是C而不是C ++。在C ++中,通常使用文件流对象(如ifstreamofstream)来读取和写入文件。您正在使用fopen之类的东西,它们更像是C类。

    此代码应该更好用:

    #include <stdio.h>
    
    int main() {
        int n;
        FILE * inFile;
        FILE * outFile;
        inFile = fopen ("reiz.in","r");
        outFile = fopen ("reiz.out","w");
        fscanf (inFile, "%d", &n);
        int m = n * 2;
        fprintf (outFile, "%d\n", m);
        fclose (inFile);
        fclose (outFile);
        return 0;
    }