Avatar billede damon Nybegynder
21. juli 2005 - 14:19 Der er 25 kommentarer

Tab i txt filer

Jeg vil gerne indlæse txt fil og rette et punkt i filen.

Filen ser sådanne ud

Martin  Andersen        Blå              #1      DKK

der er Tab mellem værdierne og nogle steder er der 2 tabs hvis den mellemliggende værdi er null..
Jeg skal ha ændret #1 værdien til "out"..

jeg kan godt læse filen ind:

    char buffer[256];
 
    ifstream examplefile ("c:/test.txt");
 
  if (! examplefile.is_open())
  { cout << "Error opening file"; exit (1); }


    examplefile.getline(buffer,256);
    cout << buffer << endl;

Det jeg havde tænkt mig var at læse værdierne ind en af gangen og tælle positionerne op når jeg ramte en tab.

Her er så mit spørgsmål, hvordan kan jeg se om jeg indlæser et Tab? så jeg kan tælle? og ændre?
Avatar billede rbj_fp Nybegynder
21. juli 2005 - 14:26 #1
http://www.lookuptables.com/ <- her står hvilken char du skal kigge efter, men mener at der er char(11)
Avatar billede arne_v Ekspert
21. juli 2005 - 14:32 #2
if(buffer[i]=='\t')

bør virke mener jeg
Avatar billede damon Nybegynder
21. juli 2005 - 20:41 #3
irreterende jeg kan ikke lukke spørgsmålet
Avatar billede arne_v Ekspert
21. juli 2005 - 20:43 #4
du skal have en til at ligge et svar
Avatar billede arne_v Ekspert
21. juli 2005 - 20:44 #5
(som det fremgår af linket er \t iøvrigt x09)
Avatar billede mollevp Nybegynder
21. juli 2005 - 21:10 #6
Alternativt kunne du måske bruge noget ala.

// Read from file and replace word #1 with out

#include <iostream>
#include <fstream>
#include <string>

using namespace std;

int main()
{
    // File to read from
    ifstream inFile;
   
    // Needed variables
    string data;
    unsigned int location;
 
    // Open file for reading
    inFile.open("example.txt");
   
    // Check whether the file is open
    if(!inFile.is_open()){
    cout << "Error opening file" << endl;
    return -1;
    }
   
    // Lets read from the file
    getline(inFile, data);
   
    location = data.find("#1",0);
    if(location != string::npos){
    data.replace(location, 2 , "out");
    cout << "Succes string is now: " << data << endl;
    return 0;
    }
    cout << "Failed no data replaced" << endl;
   
    return 0;
}

Så skal du bare gemme stringen igen..
Avatar billede damon Nybegynder
21. juli 2005 - 21:56 #7
Har fået løst det, mange tak for hjælpen.. har dog et til spørgsmål som i kloge hoveder måske kan hjælpe med -

Hvis jeg har x antal txt filer liggende i en mappe er der så en måde jeg kan læse dem ind EN af gangen uden at vide hvad de hedder.. (det er alt i mappen der skal læses ind en af gangen)
Avatar billede arne_v Ekspert
21. juli 2005 - 21:58 #8
ja - du kan godt finde alle filer i et dir
Avatar billede arne_v Ekspert
21. juli 2005 - 21:59 #9
Win32 API:

  WIN32_FIND_DATA data;
  HANDLE h = FindFirstFile("*.c",&data);
  if(h!=INVALID_HANDLE_VALUE) {
    printf("%s\n",data.cFileName);
    while(FindNextFile(h,&data)) {
        printf("%s\n",data.cFileName);
    }
  }
  FindClose(h);
Avatar billede arne_v Ekspert
21. juli 2005 - 22:01 #10
unix kompatibelt (virker også på windows):

  DIR *dirp;
  struct dirent *entp;
  dirp = opendir(path);
  while((entp = readdir(dirp)) != NULL)
  {
      printf("%s\n",entp->d_name);
  }
  closedir(dirp);
Avatar billede arne_v Ekspert
21. juli 2005 - 22:02 #11
begge er hurtigt copy pastet og tilrettet fra noget anden kode så check lige for de værste
slag fejl
Avatar billede damon Nybegynder
22. juli 2005 - 14:58 #12
Win32 API:

  WIN32_FIND_DATA data;
  HANDLE h = FindFirstFile("*.c",&data);
  if(h!=INVALID_HANDLE_VALUE) {
    printf("%s\n",data.cFileName);
    while(FindNextFile(h,&data)) {
        printf("%s\n",data.cFileName);
    }
  }
  FindClose(h);

har brugt denne her, og den virker - problemet er at jeg ikke kan finde ud af hvordan jeg får stien på filen, data kan jeg kun få til at give mig filenavnet, og jeg kan ikke tilføje stien til filnavnet ved at plusse en string til en pointer ..
Avatar billede arne_v Ekspert
22. juli 2005 - 15:23 #13
string s = "C:\\dir\\";

s += data.cFileName;

bør vel virke.
Avatar billede damon Nybegynder
22. juli 2005 - 16:34 #14
hmm, problemet komemr når jeg skriver

ifstream(s);

så får jeg
error C2664: '__thiscall std::basic_ifstream<char,struct std::char_traits<char> >::std::basic_ifstream<char,struct std::char_traits<char> >(const char *,int)' : cannot convert parameter 1 from 'class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >' to 'const char *'
        No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called
Avatar billede arne_v Ekspert
22. juli 2005 - 17:57 #15
prøv:

ifstream f(s.c_str());
Avatar billede damon Nybegynder
22. juli 2005 - 22:17 #16
det havde jeg prøvet, virkede heller ikke, det er lidt underligt.
hvis jeg printf(s) så får jeg filens sti og navn
ex. c:/TEST/test.txt
Avatar billede arne_v Ekspert
22. juli 2005 - 22:19 #17
vender de slasher ikke den forkerte vej ?
Avatar billede damon Nybegynder
22. juli 2005 - 22:47 #18
jo, jeg sidder bare og skriver direkte, jeg har lavet dem til c:\\dir\\
som du skrev, jeg har ikke programmet foran mig mere nemlig, det har jeg ikke før mandag.. irreterende heheh
Avatar billede damon Nybegynder
22. juli 2005 - 22:48 #19
burde stadig ikke ha noget at gøre med den converteringsfejl jeg får
Avatar billede damon Nybegynder
25. juli 2005 - 13:50 #20
det virkede arne, tak.. efterlad et svar så får du den lige
Avatar billede damon Nybegynder
25. juli 2005 - 13:51 #21
Ps. ved du om der er et sted i Visual c++ man kan sætte rettigheder op? jeg kan ikke rigtigt tilgå nogle filer på en anden computer i mit netværk med ifstream
Avatar billede arne_v Ekspert
25. juli 2005 - 14:16 #22
der er jo også andre som har deltaget i tråden

----

svar fra mig

----

Der burde gælde de samme regler for Visual C++ ifstream som for alle andre
programmer - husker du at bruge "\\\\server\\share\\dir\\fil.typ" ?
Avatar billede arne_v Ekspert
25. juli 2005 - 14:17 #23
og så skal man lige ramme den lille cirkel ude til venstre ...

:-)
Avatar billede arne_v Ekspert
03. september 2005 - 18:56 #24
så mangler du bare at acceptere svaret
Avatar billede rbj_fp Nybegynder
05. september 2005 - 08:50 #25
Det er jo så dejligt at se folk husker at lukke spørgsmålene.. :-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester