繁体   English   中英

为什么我的程序在写入文件时崩溃?

[英]Why does my program crash upon writing to a file?

我知道我真的不应该在Stack交换中寻求错误解决方案,但是我是C语言的新手,我制作了一个程序来展开代码并将代码输出到.c文件中。 问题是,当我想打印一些代码行时, fputs函数到codeOutput会使程序崩溃(我到目前为止已对其进行调试)。 我已经尝试将codeOutput文件从.c更改为.txt,但是它没有任何更改。 我知道这段代码摘录并不是真正可重复的,但是我敢肯定我在编写代码时犯了一个愚蠢的错误。 这是我的代码:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>

int main()
{
    char buf[500];

    int numberOfSamples = 5;
    int numberOfElements = 10;
    int currentTest = 1;

    FILE *arrayAssignmentReader[numberOfSamples];
    FILE *codeSnippetReader[numberOfSamples];
    FILE *arrayPrintReader[numberOfSamples];
    FILE *codeOutput[numberOfSamples];

    for (int i = 0; i < numberOfSamples; i++) {
        sprintf(buf, "C:/Users/Erlandas/Desktop/Research/C/TestNo%i/ProgramNo1/SampleNo%i/ArrayAssignment.txt", currentTest, i);
        arrayAssignmentReader[i] = fopen(buf, "r+");
        sprintf(buf, "C:/Users/Erlandas/Desktop/Research/C/TestNo%i/ProgramNo2/SampleNo%i/codeSnippet.txt", currentTest, i);
        codeSnippetReader[i] = fopen(buf, "r+");
        sprintf(buf, "C:/Users/Erlandas/Desktop/Research/C/TestNo%i/ProgramNo1/SampleNo%i/ProgramNo1PrintArray.txt", currentTest, i);
        arrayPrintReader[i] = fopen(buf, "r+");

        sprintf(buf, "C:/Users/Erlandas/Desktop/Research/C/TestNo%i/codeForNo3/codeNo%i/", currentTest, i);
        struct stat st = {0};
        if (stat(buf, &st) == -1) {
            mkdir(buf);
        }

        sprintf(buf, "C:/Users/Erlandas/Desktop/Research/C/TestNo%i/codeForNo3/CodeNo%i/CodeNo%i.c", currentTest, i, i);
        codeOutput[i] = fopen(buf, "w+");
    }

    for (int currentSample = 0; currentSample < numberOfSamples; currentSample++) {

        sprintf(buf, "#include <stdio.h>\n#include <time.h>\n#include <stdlib.h>\n#include <sys/types.h>\n#include <sys/stat.h>\n#include <math.h>\n#include <unistd.h>\n#define BILLION  1000000000L\nint main()\n{\nchar buf[500];\nint numberOfElements = %i;\nint currentTest = %i;\nint randomArray[numberOfElements];\nint minIndex;\nint minValue;\nstruct timespec requestStart;\nstruct timespec requestEnd;\nlong int recordStartTime;\nlong int recordEndTime;\nlong int elapsedTime;\nFILE *arrangedArray;\nFILE *stopwatch;\nsprintf(buf,\"C:/Users/Erlandas/Desktop/Research/C/TestNo%%i/ProgramNo3/ProgramNo3Stopwatch.txt\", currentTest);\nstopwatch = fopen(buf, \"a+\");\nstruct stat st = {0};\nsprintf(buf, \"C:/Users/Erlandas/Desktop/Research/C/TestNo%%i/ProgramNo3/\", currentTest);\nif (stat(buf, &st) == -1)\n{\nsprintf(buf, \"C:/Users/Erlandas/Desktop/Research/C/TestNo%%i/ProgramNo3/\", currentTest);\nmkdir(buf);\n}\nsprintf(buf, \"C:/Users/Erlandas/Desktop/Research/C/TestNo%%i/CodeForNo3/SampleNo%i/ArrangedArray.txt\", currentTest, currentSample);\narrangedArray = fopen(buf, \"w+\");\n", numberOfElements, currentTest, currentSample);
        fputs(buf, codeOutput[currentSample]);

        while (buf[0] != EOF){
            fgets(buf, 500, arrayAssignmentReader[currentSample]);
            fputs(buf, codeOutput[currAentSample]);
            fputs("\n", codeOutput[currentSample]);
        }

        sprintf(buf, "clock_gettime(CLOCK_MONOTONIC, &requestStart);\nrecordStartTime = requestStart.tv_nsec + requestStart.tv_sec * BILLION;\n");
        fputs(buf, codeOutput[currentSample]);

        while (buf[0] != EOF) {
            fgets(buf, 500, codeSnippetReader[currentSample]);
            fputs(buf, codeOutput[currentSample]);
            fputs("\n", codeOutput[currentSample]);
        }

        sprintf(buf, "clock_gettime(CLOCK_MONOTONIC, &requestEnd);\nrecordEndTime = (requestEnd.tv_nsec + requestEnd.tv_sec * BILLION);\nelapsedTime = recordEndTime - recordStartTime;\nsprintf(buf, \"%%li\\n\", elapsedTime);\nfputs(buf, stopwatch);\n");
        fputs(buf, codeOutput[currentSample]);

        while (buf[0] != EOF) {
            fgets(buf, 500, arrayPrintReader[currentSample]);
            fputs(buf, codeOutput[currentSample]);
            fputs("\n", codeOutput[currentSample]);
        }

        sprintf(buf, "\nfclose(output);\nfclose(arrayOutput);\nfclose(arrangedArray);\n}\nfclose(stopwatch);\nreturn 0;\n}\n");
        fputs(buf, codeOutput[currentSample]);
    }

    return 0;
}

对于以下语句, buf不够大:

sprintf(buf, "#include <stdio.h>\\n#include <time.h>\\n#include <stdlib.h>\\n#include <sys/types.h>\\n#include <sys/stat.h>\\n#include <math.h>\\n#include <unistd.h>\\n#define BILLION 1000000000L\\nint main()\\n{\\nchar buf[500];\\nint numberOfElements = %i;\\nint currentTest = %i;\\nint randomArray[numberOfElements];\\nint minIndex;\\nint minValue;\\nstruct timespec requestStart;\\nstruct timespec requestEnd;\\nlong int recordStartTime;\\nlong int recordEndTime;\\nlong int elapsedTime;\\nFILE *arrangedArray;\\nFILE *stopwatch;\\nsprintf(buf,\\"C:/Users/Erlandas/Desktop/Research/C/TestNo%%i/ProgramNo3/ProgramNo3Stopwatch.txt\\", currentTest);\\nstopwatch = fopen(buf, \\"a+\\");\\nstruct stat st = {0};\\nsprintf(buf, \\"C:/Users/Erlandas/Desktop/Research/C/TestNo%%i/ProgramNo3/\\", currentTest);\\nif (stat(buf, &st) == -1)\\n{\\nsprintf(buf, \\"C:/Users/Erlandas/Desktop/Research/C/TestNo%%i/ProgramNo3/\\", currentTest);\\nmkdir(buf);\\n}\\nsprintf(buf, \\"C:/Users/Erlandas/Desktop/Research/C/TestNo%%i/CodeForNo3/SampleNo%i/ArrangedArray.txt\\", currentTest, currentSample);\\narrangedArray = fopen(buf, \\"w+\\");\\n", numberOfElements, currentTest, currentSample);

您应该使buf更大,并使用snprintf()来避免缓冲区溢出。

您应该将所有这些字符串分成适合常规行的片段:

sprintf(buf, "clock_gettime(CLOCK_MONOTONIC, &requestEnd);\n"
             "recordEndTime = (requestEnd.tv_nsec + requestEnd.tv_sec * BILLION);\n"
             "elapsedTime = recordEndTime - recordStartTime;\n"
             "sprintf(buf, \"%%li\\n\", elapsedTime);\n"
             "fputs(buf, stopwatch);\n");
fputs(buf, codeOutput[currentSample]);

但请注意,其中的某些功能根本不需要sprintf() :由于您没有替换任何变量,因此您可以直接使用字符串调用fputs

此外,测试文件结尾的方法是不正确的: while (buf[0] != EOF)无法测试您是否已到达文件结尾,但检查fgets()的返回值是执行此操作的正确方法:

    while (fgets(buf, 500, arrayAssignmentReader[currentSample]) != NULL) {
        fputs(buf, codeOutput[currentSample]);
        fputs("\n", codeOutput[currentSample]);
    }

您应该检查fopen()函数的结果以确保它不是NULL:

codeOutput[i] = fopen(buf, "w+");
if (codeOutput[i] == NULL) {
    perror(buf); /* Assuming perror is supported and you
                    #include <errno.h> */
    exit();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM