我编写了一个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();
}
}
但是当我运行程序时,没有创建文件。代码有什么问题吗?我将如何创建文件?
答案 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;
...