从读取文件中的数据创建多个文件

时间:2016-09-25 14:50:48

标签: c++ file fstream

我编写了一个c ++代码来从文件中读取并从那里创建多个文件并将数据写入其中。我的输入文件如下:

11 2 3
22 3 14
33 4 15

每行的第一个数字是文件名,后两个数字是要写入其中的数据。我的代码如下:

#include<iostream>
#include<cstdio>
#include<stdlib.h>
#include<fstream>
using namespace std;
main()
{
    ofstream os1;
    FILE *fp;
    int a;
    int k1,k2;
    char fileName[] = "0.txt";
    fp=fopen("input.txt", "r");

    while (fscanf(fp, "%d", &a) != EOF)
    {
        fscanf(fp, "%d", &k1);
        fscanf(fp, "%d", &k2);
        fileName[0]=a;
        os1.open (fileName);
        os1<<k1<<"\t"<<k2<<"\n";
        os1.close();
    }

}

但是当我运行程序时,没有创建文件。代码有什么问题吗?我将如何创建文件?

1 个答案:

答案 0 :(得分:2)

当您阅读&#34;文件名&#34;使用fscanf(fp, "%d", &a);变量a将不包含&#39; 1&#39;的ascci值。但是二进制值为1的整数。

然后,当您使用fileName[0]=a;设置文件名的第一个字符时,该字符将是&#39; \ x01`,因此是不可打印的字符。这是prohibited in many filesystems,这可能会导致您的开放失败。

因此,请始终检查文件的状态以查看是否打开成功。

顺便说一句,为什么不使用ifstream来阅读文件?

int k1,k2;
string fileName = "0.txt";  
ifstream ifs("input.txt");

if (!ifs) {
    cerr << "Couldn't open input file" <<endl; 
    return 1; 
}

while (ifs >> fileName[0]) {    // note that you read a char, now 
    ifs >> k1 >> k2;
    ofstream os1(fileName);
    if (! os1) 
        cerr <<"Couldn't open output file "<<fileName<<endl; 
    else {
        os1<<k1<<"\t"<<k2<<"\n";
    } // closing is done automatically as os1 goes out of scope
 }

修改

好吧,你的原始代码建议你期望读取一个单位来构造文件名,所以我只是在我的答案中转换为等价的东西。

因此,如果您想将字符串作为第一个元素读取,则相对容易完成:而不是直接读入fileName[0],请执行:

string fileName; 
string fileSuffix = ".txt";   // only
... 
while (ifs >> fileName) {  // read a string 
    fileName += fileSuffix; 
...  

优点是您现在可以输入任何内容,例如:

11 2 3
E2 3 14
primes 7 11  

如果你想读取一个整数,你可以很好地做到这一点

int a; 
string fileName; 
string fileSuffix = ".txt";   
... 
while (ifs >> a) {            // for people loving integers 
    fileName = to_string(a) + fileSuffix; 
...