2

このコードはディレクトリを開き、ディレクトリ内のすべてのファイルについて、ファイル内のデータのすべての行をループし、それを解析して計算を行い、結果のデータを新しいファイルに出力します。

問題は、最大で約1021個のファイルしか出力できないことです。すべてのデータを出力した後、すべてを閉じているfopensので、何が間違っているのかわかりません。

開いているファイルを閉じるべきではないfclose()ので、これは起こりませんか?

int main(int argc, char *argv[])
{

 //sample data values
  double lat;
  double lon;  
  double convergence;   
  double pt_scale;        
  int    zone = 54;              
  double major_axis = 6378137.0000;        
  double flattening = (1/298.2572);        
  double zoneWidth = 6;         
  double centMeridian = -177;      
  double falseEast = FALSE_EASTING;         
  double falseNorth = FALSE_NORTHING;
  double scale = SCALE_FACTOR;  

  int max_size = 128;
  int current_size = max_size;
  char *pathStr = malloc(max_size);
  char *outPathStr = malloc(max_size);
  char coData[100]; //max length of line;
  long firstTerm, secondTerm; //terms we will split the line into, lat, lon, elevation.
  int counter = 0; //pos counter
  int d = EOF; //end of file ASCII
  char strIn[200];
  char* elevation;
  char strOut[200];
  char dirOut[200]; //sprintf must use a actual defined buffer otherwise there will be a buffer overflow.
  char* cchr;
  int j;
  _setmaxstdio(2048);
  printf("Please enter the path of the files: \n");
  getUserInput(pathStr, current_size, max_size); 
  printf("Please enter the output path of the files: \n");
  getUserInput(outPathStr, current_size, max_size);
  //loop through each file in the directory. Open the file, convert, then close it.
  //we will use dirent.h as it is cross platform so we wont have to worry about sharing issues
  DIR *dir; //new directory
  struct dirent *ent;
  dir = opendir(pathStr); //allcate it a path
  if(opendir(pathStr) == NULL)
  { printf("Error: %d (%s)\n", errno, strerror(errno));}
  int k;

  if(dir != NULL)
  {

         while((ent = readdir(dir)) != NULL) //loop through each file in the directory.
         {
                    //open the file and loop through each line converting it then outputing it into a new file
                if((!strcmp(ent->d_name,"..") || !strcmp(ent->d_name,".")) == 1)
                {
                        //dont want these directories
                        continue;
                }
                else
                {
                sprintf(strIn,"%s%s",pathStr,ent->d_name);    //get the file n
                FILE *fp = fopen(strIn, "r");
                if(fopen(strIn, "r") == NULL) //for inputting file
                { printf("Error: %d (%s)\n", errno, strerror(errno));
                                getchar();
                                  break; }

                sprintf(dirOut,"%s%d%s",outPathStr,counter,".geo");
                printf("%s \n",dirOut);
                FILE *fp2 = fopen(dirOut, "w"); //for outputting file
                if(fopen(dirOut, "w") == NULL)
                     { printf("Error: %d (%s)\n", errno, strerror(errno));
                      getchar();
                      break; }


                     while(fgets(coData, 100, fp) != NULL)//loop through line by line, allocate into 2 doubles and a string, pass the two coordinates and convert
                     {
                        //extract terms from coData                
                        char * pch; //pointer to array pos
                        char * pend;                          
                        pch = strtok(coData," ");                          
                        j = 0;

                            while(j <= 2) //We only want to split the first three parameters.
                            {
                                    //convert char array to double for co-oridinate conversion  

                                    if(j == 0)
                                    {
                                    firstTerm = atof(pch);         //latitude;           
                                    j++;
                                    continue;
                                    }
                                    if(j == 1)
                                    {
                                    pch = strtok(NULL, " ");
                                    secondTerm = atof(pch); //longitude
                                    j++;
                                    continue;
                                    }
                                    if(j == 2)
                                    {
                                    pch = strtok(NULL," ");
                                    elevation = pch; //elevation doesnt need to be converted because it isnt used in the coordinate conversion.
                                    break;
                                    }                                                               
                            }
                       grid2spheroid(&lat,&lon,&convergence,&pt_scale,firstTerm,secondTerm,zone,0, major_axis,flattening,zoneWidth,centMeridian,falseEast,falseNorth,scale);                                            
                       sprintf(strOut,"%f %f %s",lat,lon,elevation);
                       //printf("%d %d", lat, lon);                          
                       fputs(strOut,fp2);


                     }     //end of while        

                      fclose(fp2);
                      fclose(fp);
                      counter++;
                 }

                }
                closedir(dir);
  }
  free(pathStr); //finished using the path string so we can finish the 
  free(outPathStr);
  getchar(); 
  return 0;

 }

  void getUserInput(char *pathStr, int current_size, int max_size)
 {
 unsigned int i = 0;
 if(pathStr != NULL)
  {
              int c = EOF;

              //get the user input and reallocate the memory size if the input it too large.
              while((c = getchar()) != '\n' && c != EOF) //WHILE NOT END OF FILE OR NEW LINE (USER PRESSED ENTER)
              {
                   pathStr[i++] = (char)c;

                   if(i == current_size)
                   {
                        current_size = i+max_size;
                        pathStr = realloc(pathStr, current_size);
                   }    
              }
  }
}
4

3 に答える 3

3

すべてのファイルを閉じているわけではありません;-)

FILE *fp = fopen(strIn, "r");
if(fopen(strIn, "r") == NULL) //for inputting file

同じことが出力にも当てはまります。

私はあなたがもっと次のようなことを意味したと思います:

FILE *fp = fopen(strIn, "r");
if(fp == NULL) //for inputting file
{
     // error handling.
于 2012-07-12T06:23:24.323 に答える
1

いやいや!すべてのファイルを2回開いています(そして1回だけ閉じています)。

  /* Bad! */
  dir = opendir(pathStr); //allcate it a path
  if(opendir(pathStr) == NULL)
  { printf("Error: %d (%s)\n", errno, strerror(errno));}
  int k;

  /* Correct */
  dir = opendir(pathStr); //allocate it a path
  if(!dir) { 
    printf("Error: %d (%s)\n", errno, strerror(errno));
    return;
  }

fopen()でも同じことをしています。両方の場所で:)

ポインタを確認するだけです; 「fopen()」を2回呼び出さないでください。「opendir()」を2回呼び出さないでください。

また、オープニングブレースと同じ行にコードを配置しないでください。わかった?

于 2012-07-12T06:23:51.163 に答える
0
dir = opendir(pathStr); //allcate it a path
if(opendir(pathStr) == NULL)

(...)

FILE *fp2 = fopen(dirOut, "w"); //for outputting file
if(fopen(dirOut, "w") == NULL)

(...)

FILE *fp = fopen(strIn, "r");
if(fopen(strIn, "r") == NULL) //for inputting file

ここでは、ファイルを2回開きますが、ポインタを1回だけ保存します。これらを次のように変更します。

FILE *fp = fopen(strIn, "r");
if(fp == NULL) //for inputting file

もう1つも同じように。

于 2012-07-12T06:24:12.883 に答える