2016-11-04 126 views
1

我知道我真的不应该在Stack交换中请求bug解决方案,但我是C新手,并且制作了一个展开代码并将代码打印到.c文件中的程序。问题是,当我想打印出一些代码行时,codeOutput的fputs函数崩溃了程序(我调试过它)。我试着将.c中的codeOutput文件改为.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; 
} 

回答

0

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

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

哦是的,谢谢! –

+0

刚刚尝试过,并没有改变任何东西。我没有问题地打开这些文件,但存在向他们扭动的问题 –

2

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]); 
    } 
相关问题