Permalänk
Medlem

C++ till C

Jag försöker skriva ett program i C, i programmet så ska en textfil läsas in och stoppas i en char-array.
Jag vet hur jag ska göra i C++ men inte i C då C inte har iostream.
Så jag undrar hur motsvarande program ser ut i C.

#include <iostream> #include <fstream> #include <stdlib.h> #include <cmath> #include <cstring> using namespace std; ifstream input; void getchars(string buf, int row, int wide, char board[]) { int temp; temp = row * wide; for (int i = 0; i<= wide ; i++){ board[temp + i] = buf[i]; } } int main () { char buf[80]; string line; int width; int height; int counter; height = 0; input.open("level.txt"); while (input.eof() == false) { input.getline(buf, 80, '\n'); line = buf; width = line.length(); height++; cout << line << endl; } input.close(); cout << width << endl; cout << height << endl; char board[height*width]; counter = 0; input.open("level.txt"); while (input.eof() == false) { input.getline(buf, 80, '\n'); getchars(buf, counter, width, board); counter++; } input.close(); }

Så om man har en textfil med innehållet:

##### # # # # # # #####

Ska resultatet i programmet bli:

##### # # # # # # ##### 10 10

Permalänk
Medlem

är inte så vass på c, men googla FILE och fscanf alternativt fgets.

Permalänk
Hedersmedlem

Något åt det här hållet kanske?

#include <stdio.h> #include <string.h> int main(int argc, char** argv) { FILE* input = fopen("level.txt", "r"); char buf[80]; int height = 0; int width; while(fscanf(input, "%[^\n]\n", buf) > 0) { width = strnlen(buf, 80); ++height; printf("%s\n", buf); } fclose(input); printf("%d\n%d\n", width, height); return 0; }

Permalänk
Avstängd

Elgot, kompakt och snygg kod. Du verkar kunna C ganska bra. Jag brukar tycka att ju kompaktare kod (men läslig) desto bättre programmerare.

Kan du förklara fscanf satsen lite? Vad gör inneållet i strängen?

Permalänk
Hedersmedlem
Skrivet av saddam:

Kan du förklara fscanf satsen lite? Vad gör inneållet i strängen?

Det är ungefär som ett reguljärt uttryck; strängen innehåller ett mönster (i det här fallet en följd av tecken som inte är '\n' och sedan just '\n') som inströmmen (input i det här fallet) matchas mot. Element som föregås av procenttecken konverteras och tilldelas till de variabler som följer strängen i anropet.

Permalänk
Medlem
Skrivet av Elgot:

Något åt det här hållet kanske?

#include <stdio.h> #include <string.h> int main(int argc, char** argv) { FILE* input = fopen("level.txt", "r"); char buf[80]; int height = 0; int width; while(fscanf(input, "%[^\n]\n", buf) > 0) { width = strnlen(buf, 80); ++height; printf("%s\n", buf); } fclose(input); printf("%d\n%d\n", width, height); return 0; }

Det är inte rekommenderat att använda sig av scanf/fscanf för att hantera blanka tecken. Reglerna är IMO väldigt icke-intuitiva och man får inte önskad effekt om filen t.ex. inleds med blanka rader (eller har blanka rader alls för den delen).

gets/fgets är att föredra här (direkta motsvarigheter till C++'s getline).

Visa signatur

"Nothing is impossible because impossible itself says I M Possible..."

Permalänk
Medlem

Tack för hjälpen!

Permalänk
Avstängd
Skrivet av Weeblie:

Det är inte rekommenderat att använda sig av scanf/fscanf för att hantera blanka tecken. Reglerna är IMO väldigt icke-intuitiva och man får inte önskad effekt om filen t.ex. inleds med blanka rader (eller har blanka rader alls för den delen).

gets/fgets är att föredra här (direkta motsvarigheter till C++'s getline).

Åh fan. Hur skulle det bli med gets/fgets? Nån aning?

Permalänk
Medlem
Skrivet av saddam:

Åh fan. Hur skulle det bli med gets/fgets? Nån aning?

Google är din vän!

while(gets(str) != NULL) {...}
while(fgets(str, strLength, file) != NULL) { ... }

Observera att funktionerna även skiljer sig i termer av hurvidda '\n' läses in till strängen eller ej.

Visa signatur

"Nothing is impossible because impossible itself says I M Possible..."

Permalänk
Medlem
Skrivet av Weeblie:

gets/fgets är att föredra här (direkta motsvarigheter till C++'s getline).

gets rekommenderas inte, då det inte går att ge en maxgräns på hur mycket som ska läsas in.

Visa signatur

Vill du ha svar? Citera mig gärna.

Permalänk
Medlem
Skrivet av lajnold:

gets rekommenderas inte, då det inte går att ge en maxgräns på hur mycket som ska läsas in.

Man kan ju undra hur genomtänkt det där var... man kan i alla fall få en någorlunda ekvivalent (men säkrare, och med annan newlinehantering) variant genom att köra något i stil med fgets(str, strLength, stdin).

Permalänk
Avstängd

Ok, så det är fgets som rekommenderas när man läser in filer i C, alltså?

Permalänk
Medlem
Skrivet av saddam:

Ok, så det är fgets som rekommenderas när man läser in filer i C, alltså?

Precis. Vill man ha per-rad-inläsning är fgets ett av de bättre alternativen.

Visa signatur

Vill du ha svar? Citera mig gärna.