C中的运行时错误

时间:2014-12-29 17:09:41

标签: c runtime-error file-handling c-strings

当我到达文件中间时,我的代码会出现运行时错误。 如果我更改temp2或temp1的值,那么它会在文件的开头崩溃。 我无法理解我在此文件中所犯的错误。

它在一个有100行的小文件上顺利运行。

我正在创建一个文件搜索项目,所以我需要存储包含整个驱动器目录的大文件。

#include<stdio.h>
#include<string.h>
#include<windows.h>
#include<conio.h>
char file[99999];
void brek(char *p, char *q);
void main()
{
    FILE *fp;
    int x = 0, y = 0;
    int a = 0, b = 0;
    int g = 0;
    char temp1[10000];          // temp1 is simply for jumping to the date against the given directory or file
        // the main array storing the lines is temp2.
     char temp2[1000][1000];

    system("chdir C:\\Users\\Faraz\\Documents && dir /s > dir.txt");
    fp = fopen("C:\\Users\\Faraz\\Documents\\dir.txt", "r");

    while ((y = getc(fp)) != EOF)
    {
        file[x] = y;
        x++;
    }
    fclose(fp);
    file[x] = '\0';
    puts(&file[0]);

    // <----the copying of the file to the string "file (globally declared)"is
    // done---->//

    getche();
    system("cls");

    // <-------------------start loop-------------------->//

    a = 0;
    while (file[a] != '\0')     // <-------starting of the loop
    {

        while (file[a] != '/')
        {
            temp1[a] = file[a];
            a++;
        }
        temp1[a] = '\0';

        a = a - 2;
        b = 0;
        while (file[a] != '\n')
        {
            temp2[g][b] = file[a];
            b++;
            a++;
        }
        temp2[g][b] = '\0';
        puts(&temp2[g][0]);

        g++;

    }
    // <-----------------end loop---------------------->//

}

2 个答案:

答案 0 :(得分:0)

试试这个

int 
main(int argc, char **argv)
{
    LPWIN32_FIND_DATAA fdFile;
    HANDLE hFind = NULL;
    const char *sPath = "C:\\Users\\Faraz\\Documents\\*.*";

    if((hFind = FindFirstFile(sPath, &fdFile)) == INVALID_HANDLE_VALUE)
    {
        printf("no such directory %s\n", sPath);
        return -1;
    }

    do
    {
        printf("Directory: %s\n", fdFile->cFileName);
    }
    while(FindNextFile(hFind, &fdFile)); //Find the next file.

    FindClose(hFind); //Always, Always, clean things up!

    return 0;
}

答案 1 :(得分:0)

我发现答案是你只是无法在512 MB内存中加载1gb文件。 因此我们使用

在字符串顶部定义缓冲区大小
#define BUFFER_SIZE 512

并且使用fgets我们逐行读取文件,因此不会重载由OS分配的内存空间。

当我们开始使用堆空间时,动态内存分配不是我们问题的解决方案。