13

I'm trying to make a program that counts the number of lines of a file, when I try to pass the absolute path to the fopen function, is simply tells me that is not found, here is my code:

#include <iostream>
#include <stdio.h>
#include <stdlib.h>

using namespace std;

int main(int argc, char *argv[])
{
    int i=0;
    char array[100];

        char caracteres[100];
        FILE *archivo;
        archivo = fopen("C:\Documents and Settings\juegos psps.txt","r");
        if (archivo == NULL){cout<<"Dont Work";}
        while (feof(archivo) == 0)
        {
                fgets(caracteres,100,archivo);
                i++;
                }
                cout << "Number of lines:" << i ;
                return 0;
}

How should I pass the absolute path to my program so you can open the file?

Alexander O'Mara
  • 58,688
  • 18
  • 163
  • 171
franvergara66
  • 10,524
  • 20
  • 59
  • 101

6 Answers6

21

Use double slashes:

"C:\\Documents and Settings\\juegos psps.txt"
SingerOfTheFall
  • 29,228
  • 8
  • 68
  • 105
  • @SingerOfTheFail I already try that but still not working, may depend on the version of my operating system?. I've been stuck with this hour. – franvergara66 Jul 13 '12 at 07:44
  • @Melkhiah66, under what OS are you running your program? Also, are you sure there is no typo in the filename (like an extra space maybe)? – SingerOfTheFall Jul 13 '12 at 07:49
  • @SingerOfTheFail Im running the program in Windows 7, using code::blocks, and not theres no typo in the filename – franvergara66 Jul 13 '12 at 07:53
  • @Melkhiah66, well that's very weird in this case, because this code does work fine for me. Maybe your program doesn't have the permission to read the file? – SingerOfTheFall Jul 13 '12 at 07:57
7

It is not working because the compiler examines a backslash in a literal string together with the next character and usually interprets them as one character in all. Such two-char sequences in string literals are called escape sequences.

The sequences \D and \j do not map to anything (contrast this with \n which maps to the newline character), and in this case the standard says that the compiler can interpret them as it chooses. Some compilers choose to ignore the backslash, which in your case would result in the equivalent:

archivo = fopen("C:Documents and Settingsjuegos psps.txt","r");

(You can try creating a file with this name to test if this is what your compiler does).

The correct escape sequence for a backslash is a double backslash, so you should write it as

archivo = fopen("C:\\Documents and Settings\\juegos psps.txt","r");
Jon
  • 428,835
  • 81
  • 738
  • 806
  • yeah man, i know that. the problem is that when I put double slash to the path just as I can not open the file and the program enters the condition if (file == NULL) – franvergara66 Jul 13 '12 at 07:48
  • 1
    @Melkhiah66: There's nothing wrong with the code if the filename is correctly specified, so you should be looking if the file is there, permissions etc. – Jon Jul 13 '12 at 07:53
3

works as well on windows and linux: / instead of escaping backslashes \\

"C:/dir1/dir2/file.ext"
Preexo
  • 2,102
  • 5
  • 29
  • 37
1

Check the spaces in the filename. The slashes were properly escaped, but the blank space was not.

Try:

fopen("C:\\\\Documents\ and\ Settings\\\juegos psps.txt","r")

Tyler Jandreau
  • 4,245
  • 1
  • 22
  • 47
Greg S
  • 99
  • 2
  • 5
0

make a new folder in the code blocks folder

in the project folder next to main and header file make new file "exemple1" and put your file in it "file.txt",then

string nom_fichier;
nom_fichier = "exemple1/file.txt" ;
fichier = fopen(nom_fichier.c_str(), "r+");
iheb athimni
  • 15
  • 10
  • While this code may answer the question, providing additional context regarding why and/or how this code answers the question improves its long-term value. – rollstuhlfahrer Mar 06 '18 at 15:50
-1

Given all codes and paths are correctly typed, another possible reason that causes fopen doesn't work could be your Project Properties-> C/C++ Code Generation->Runtime Library set to /MD rather than /MDd for Debug build, this setting should correspond the project configuration, XX to Release XX(d) to Debug

liyi3c
  • 59
  • 6