2013-04-17 2 views
1

Siemens WinCC 7.0에서 C 스크립트를 사용하여 원본 및 대상 쉼표가 포함 된 텍스트 파일을 읽는 중입니다.c 스크립트가 마지막 루프 실행시 이름 만 변경하는 이유

C:\Users\Administrator\Desktop\C File Transfer Test\Source\Cat.txt,P:\Cat.txt 
C:\Users\Administrator\Desktop\C File Transfer Test\Source\Cat1.txt,P:\Cat1.txt 
C:\Users\Administrator\Desktop\C File Transfer Test\Source\Cat2.txt,P:\Cat2.txt 
C:\Users\Administrator\Desktop\C File Transfer Test\Source\Cat3.txt,P:\Cat3.txt 
C:\Users\Administrator\Desktop\C File Transfer Test\Source\Cat4.txt,P:\Cat4.txt 

나는

#include "apdefap.h" 


void File_Transfer() 
{ 
    #define MODUL "CopyProjekt " 
    char pathIn[100]; 
    char pathOut[100]; 
    char szProjektname[255]; 
    FILE * fpInFile ; 
    FILE * fpOutFile ; 
    FILE *TempSource; 
    FILE *TempDestination; 
    #pragma code ("kernel32.dll") 
    BOOL CopyFileA(LPCTSTR,LPCTSTR,BOOL); 
    #pragma code() 
    DM_DIRECTORY_INFO dmDirInfo; 
    DM_PROJECT_INFO dmProjectInfo; 
    CMN_ERROR dmError; 
    char *source; 
    char *destination; 
    char line[1000]; 
    char * tokens; 
    char *tempTokens; 
    int i; 
    char tempString[1000]; 
    if (DMGetProjectDirectory("PDLRT", szProjektname, &dmDirInfo, &dmError)!= NULL) 
    { 
     strcat(pathIn , dmDirInfo.szProjectDir) ; 
     strcat(pathOut, dmDirInfo.szProjectDir) ; 
     strcat(pathIn ,"FilesForTransfer\\FileData.txt"); 
     strcat(pathOut ,"FilesForTransfer\\FileDataTemp.txt"); 
     //(NULL,pathIn ,"2", MB_YESNO|MB_ICONQUESTION|MB_SYSTEMMODAL);  
    } 
    //Open the file containing the folder names and paths 
    fpInFile = fopen(pathIn,"r"); 
    fpOutFile = fopen(pathOut,"w"); 
     while (fgets(line,sizeof line,fpInFile) != NULL) 
     { 
      MessageBox(NULL,line,"Read Line",MB_YESNO|MB_ICONQUESTION|MB_SYSTEMMODAL); 
      tempTokens = line; 
      tokens = strtok(tempTokens ,","); 
      while (tokens != NULL) 
      { 
       if (i == 0) 
       { 
        source = tokens ; 
       } 
       else 
       { 
        destination = tokens ; 
       } 
       i = i + 1;    
       //read the tokens again 
       tokens = strtok(NULL ,","); 
      }   
    //MessageBox(NULL,source ,destination, MB_YESNO|MB_ICONQUESTION|MB_SYSTEMMODAL); 
      //Move the file from source to destination 
      //if (CopyFileA(source,destination,FALSE) != 0)    
      if (rename(source ,destination)!=0) 
      { 
    MessageBox(NULL,"FAILED" ,"Transfer", MB_YESNO|MB_ICONQUESTION|MB_SYSTEMMODAL); 
      } 
      else 
      { 
     MessageBox(NULL,"PASSED","Transfer",MB_YESNO|MB_ICONQUESTION|MB_SYSTEMMODAL); 
      } 
     }  
    //rename(source,destination) 
    //fputs(tempstring,fpOutFile); 

    fclose(fpInFile); 
    fclose(fpOutFile); 
    remove(pathIn); 
    rename(pathOut ,pathIn); 

    //MessageBox(NULL,"done" ,"Done" , MB_YESNO|MB_ICONQUESTION|MB_SYSTEMMODAL); 
} 
이 상자가 제대로 모든 시간과 소스와 대상을 실행하는 메시지가 표시됩니다

대상으로 소스에서 파일을 이동을 통해이 파일 및 루프를 열고 다음 코드를 사용하고 바르게. 그러나 마지막 파일 이름 변경 만 작동합니다. 소스의 참조 파일에 행이 하나만 있으면 대상이 올바르게 작동합니다. 둘 이상이면 마지막에 대해서만 작동합니다.

코드를 올바르게 실행할 수 있고 조회 파일에서 올바른 데이터를 가져 오지만 이름이 올바르게 작동하지 않습니다. 어떤 아이디어라도 감사 할 것입니다. 감사

답변

1

fgets() 저장 발견하는 경우가 채우는 된 버퍼의 개행 문자 :

읽고 가장 카운트에서 - STR 내의 지정된 파일 스트림 저장을 1 개 문자. 생성 된 문자열은 항상 NULL로 종료됩니다. 파일 끝이 발생하거나, 개행 문자가 있으면 구문 분석이 중지되고,이 경우 str은 개행 문자를 포함하게됩니다.

따라서 destination 파일 이름에는 개행 문자가 포함됩니다. 이는 잘못된 것입니다. rename()을 시도하기 전에 그것을 제거에는 개행 문자가 없기 때문에

char* nl_ptr = strrchr(destination, '\n'); 
if (nl_ptr) *nl_ptr = 0; 

마지막 줄은 작동합니다.

+0

미안하지만, 새 라인 문자를 어떻게 제거합니까? – user2291370

+0

@ user2291370 페이지를 새로 고침하십시오. – hmjd

관련 문제