从'a'迭代到'x'并为每个字母创建一个'.dat'文件

时间:2014-10-21 19:22:51

标签: c++ c

我正在尝试从a迭代到x并创建文件a.dat,b.dat,...,x.dat

int main()
{
    char letter = 'A';

    FILE *fp;
    while (letter < 0x59) {
        printf("%c", letter);
        char *fname = "";
        fname[0] = letter;
        fname= strcat(fname, ".dat");
        const char * fnam = fname;
        fp = fopen(fnam, "ab+");
        fclose( fp );

        letter++;
    }
    return 0;
}

它迭代字母就好了,但这一行

fname[0] = letter;

使用&#34;分段错误&#34;崩溃程序错误。在调试器中,它表示&#34;无法访问地址处的内存。&#34; 我想用字母和#34; .dat&#34;来创建一个字符串,为此我创建一个空字符串并通过为其0元素指定其值来使其成为我想要的第一个字符。信件。但它不起作用,我不明白为什么。

5 个答案:

答案 0 :(得分:4)

只需使用char数组作为文件名:

char filename[] = "_.dat";

for (char letter = 'A'; letter <= 'X'; ++letter) {
    filename[0] = letter;
    FILE* fp = fopen(filename, "ab+");
    // etc.
}

答案 1 :(得分:1)

您正在使用长度为0("")的字符串文字,然后尝试(a)为其分配新数据(未定义)和(b)附加到它(进入未分配的空间)。

相反,您需要一个可以安全修改的字符缓冲区:

int main()
{
    char letter = 'A';
    char fname[] = "?.dat";

    FILE *fp;
    while (letter < 'Y') {
        printf("%c", letter);

        fname[0] = letter;

        fp = fopen(fname, "ab+");
        fclose( fp );

        letter++;
    }
    return 0;
}

答案 2 :(得分:1)

由于下面列出的原因,这不起作用(参见评论; UB代表未定义的行为

char *fname = "";  // Assign a non-modifiable pointer to fname
fname[0] = letter; // Trying to modify data at that pointer - UB
fname= strcat(fname, ".dat"); // Trying to write data past the end of buffer - UB

以下是解决此问题的方法:

char fname[] = "-.dat"; // Create a writable array of chars
fname[0] = letter;      // Now this assignment is allowed
// strcat is not required, because .dat is already in place

请注意,如果您在C ++中编译它,您会在第一行看到错误,因为与C不同,C ++会考虑字符串文字const char*。这也会在下一行捕获赋值,并调用strcat

答案 3 :(得分:1)

在使用之前必须分配一个空格 执行此语句时,您尝试修改文字字符串,这是不允许的

fname[0] = letter;

你必须做那样的事情

#define MAX_NAME_SIZE 20
fname = malloc(20);

或使用分配到堆栈中的数组

char fname[MAX_NAME_SIZE];

答案 4 :(得分:0)

你需要这个:

int main()
{
    char letter = 'A';

    FILE *fp;
    while (letter <= 'Z') {
        char fname[100] = "";
        fname[0] = letter;
        fname[1] = 0 ;
        strcat(fname, ".dat");
        fp = fopen(fname, "ab+");
        fclose( fp );    
        letter++;
    }
    return 0;
}